2012-05-09 12 views
10

Ecco lo scenario:Maven SNAPSHOT nomi dei file jar non è coerente con Assemblea Maven nel file manifesto

Due progetto Maven 3 costruisce.

La build 1 ha i vasi di istantanee che vengono distribuiti su Nexus.

Build 2 ha dipendenze le istantanee, cui si fa riferimento come 1.0.0-SNAPSHOT, che viene confezionato e zip utilizzando il comando mvn clean package assembly:single.

Il problema che ci si imbatte in: Di tanto in tanto, quando viene creato il gruppo, il file manifesto per il vaso a volte dire some.jar.1.0.0-SNAPSHOT e, talvolta, si dirà some.jar. 1.0.0-datetime stamp, causando così errori di classe non definiti.

C'è un modo per prevenire questo problema di denominazione nel file manifest?

--edit--

Ulteriori ricerche hanno scoperto i seguenti:

"Se l'istantanea è stata risolta da un repo allora sarà timestamped, se ne è venuto dal reattore o locale repo, allora sarà -snapshot. il plugin chiama nella logica risoluzione Maven quindi questo è il nucleo Maven comportamento ".

questo è l'i esatto ssue in cui viene eseguito. Il file manifest del 2 ° build ha sempre una voce ./lib/Framework-1.0.0-SNAPSHOT.jar dove il nome del file jar effettivo cambia tra ./lib/Framework-1.0.0-SNAPSHOT.jar e ./lib/Framework-1.0.0-timestamp.jar in base alla citazione di cui sopra.

+0

[Questo] (http://stackoverflow.com/questions/2516860/maven-how-to-create-assembly-with-snapshot-artifacts-without-timestamps-file-na) potrebbe aiutare, descrive l'impostazione outputfilenamemapping per rendere coerenti i nomi dei file nelle istantanee. – prunge

+1

Come viene generato il manifest di SNAPSHOT e come viene configurato per produrre queste informazioni? Inoltre, perché è l'assembly del pacchetto mvn clean: singolo chiamato e non semplicemente mvn clean package causa il pacchetto chiamerà il assembly-plugin configurato. – khmarbaise

+0

Non c'è manifest per lo stesso SNAPSHOT. Il manifest con il problema è nella seconda build. E con l'aiuto di un collaboratore, abbiamo trovato questo 'Se l'istantanea è stata risolta da un repository allora verrà timestampata, se proviene dal reattore o dal repository locale, allora sarà -SNAPSHOT. Il plug-in richiama la logica di risoluzione di Maven, quindi questo è il comportamento di base del computer. Questo è il problema esatto che sto avendo, ho solo bisogno di aggirare questo. Per quanto riguarda il motivo dell'assemblaggio del pacchetto: viene chiamato single, beh, perché siamo nuovi per Maven nel suo complesso. – Thaldin

risposta

6

In <dependencySet> è necessario impostare <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>

ad esempio:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 
    <id>appserverB</id> 
    <formats> 
    <format>zip</format> 
    </formats> 
    <dependencySets> 
    <dependencySet> 
     <outputDirectory>/lib</outputDirectory> 
     <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping> 
     <includes> 
     <include>application:logging</include> 
     <include>application:core</include> 
     <include>application:utils</include> 
     <include>application:appserverB</include> 
     </includes> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

Se si utilizza uno dei incorporato descrittori di montaggio è necessario replicare per la vostra auto e aggiungere nell'entrata outputFileNameMapping

0

utilizzare <useBaseVersion>false</useBaseVersion>, quando è necessario copiare le dipendenze. Per esempio:

   <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-dependency-plugin</artifactId> 
        <version>2.8</version> 
        <executions> 
         <execution> 
          <id>copy</id> 
          <phase>package</phase> 
          <goals> 
           <goal>copy-dependencies</goal> 
          </goals> 
          <configuration> 
           <outputDirectory>${project.build.directory}</outputDirectory> 
           <useBaseVersion>false</useBaseVersion> 
          </configuration> 
         </execution> 
        </executions> 
       </plugin> 
0

Per coloro che corrono in questo e vedere la risposta di Stephen Connolly, ma ancora finiscono per avere eccezioni, questo potrebbe essere dovuto al fatto che alcune dipendenze hanno classificatori nei loro nomi. Poi si dovrà adattare il modello per utilizzare la dashClassifier come un valore opzionale:

<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping> 

Ciò funzionerà anche se il dependecy utilizzato non dispone di un classificatore.

Vedere documentation for the assembly plugin per ulteriori dettagli.

Problemi correlati