2012-05-09 13 views
10

Aquí está el panorama:Maven INSTANTÁNEA nombres de archivo JAR no es coherente utilizando Maven Asamblea en el archivo MANIFIESTO

dos proyectos Maven 3 se basa.

La compilación 1 tiene contenedores de instantáneas que se implementan en Nexus.

Build 2 tiene dependencias en las instantáneas, referenciados como 1.0.0-SNAPSHOT, que está empaquetado y se subió la cremallera con el comando mvn clean package assembly:single.

El problema que nos encontramos con: En ocasiones, cuando se está creando el montaje, el archivo MANIFEST para el frasco a veces decir some.jar.1.0.0-INSTANTÁNEA y, a veces dirá some.jar. 1.0.0-datetime stamp, lo que causa errores de clase no definidos.

¿Hay alguna forma de evitar este problema de nomenclatura en el archivo de manifiesto?

--edit--

Otras investigaciones han descubierto lo siguiente:

"Si la instantánea se resolvió a partir de un acuerdo de recompra entonces será marcado con la fecha, si viniera del reactor o local repo, entonces será -SNAPSHOT. el plugin pone en la lógica de resolución experto por lo que este es el núcleo experto comportamiento. "

ésta es la i exacta ssue que se está ejecutando. El archivo de manifiesto segunda construcción siempre tiene una entrada de ./lib/Framework-1.0.0-SNAPSHOT.jar donde como los cambios de nombre de archivo jar reales entre ./lib/Framework-1.0.0-SNAPSHOT.jar y ./lib/Framework-1.0.0-timestamp.jar según la cita anterior.

+0

[Esto] (http://stackoverflow.com/questions/2516860/maven-how-to-create-assembly-with-snapshot-artifacts-without- timestable-file-na) podría ayudar, describe la configuración de outputfilenamemapping para hacer que los nombres de los archivos sean coherentes en las instantáneas. – prunge

+1

¿Cómo se genera el manifiesto de SNAPSHOT y cómo está configurado para producir esta información? Además, ¿por qué mvn clean package assembly: paquete único llamado y no simplemente mvn package causa que el paquete llame al complemento ensamblado configurado. – khmarbaise

+0

No hay ningún manifiesto para SNAPSHOT. El manifiesto con el problema está en la 2da construcción. Y con la ayuda de un compañero de trabajo, encontramos 'Si la instantánea se resolvió a partir de un repositorio, se marcará con la fecha, si proviene del reactor o del repositorio local, entonces será -SNAPSHOT. El complemento llama a la lógica de resolución maven, por lo que este es el comportamiento principal del maven. Este es el problema exacto que estoy teniendo, solo necesito solucionar esto. En cuanto a por qué paquete de ensamblaje: se llama single, bueno, eso es porque somos nuevos en maven como un todo. – Thaldin

Respuesta

6

En <dependencySet> debe configurar <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>

por ejemplo:

<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> 

Si está utilizando uno de los incorporada descriptores de montaje tendrá que repetirlo para su auto y añadir en la entrada outputFileNameMapping usted mismo

0

use <useBaseVersion>false</useBaseVersion>, cuando necesite copiar dependencias. Por ejemplo:

   <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

Para los que corren en esto y ver la respuesta de Stephen Connolly pero aún así llegar a tener excepciones, esto podría ser debido al hecho de que algunas dependencias tienen clasificadores en sus nombres. A continuación, tendrá que adaptar el modelo a utilizar el dashClassifier como un valor opcional:

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

Esto funcionará incluso si el dependecy utiliza no tiene un clasificador.

Consulte el documentation for the assembly plugin para obtener más información.

Cuestiones relacionadas