2009-10-05 12 views
27

Tengo un proyecto por el cual intento crear un archivo zip de distribución que contiene (entre otros archivos) un archivo ejecutable con dependencias de mi proyecto java.plugin maven-assembly: cómo crear conjuntos anidados

Así que en cierto modo me quiere que se vea como esto:

-wiki-search-1.0.0-dist.zip 
    -wiki-search.bat 
    -wiki-search-help.html 
    -wiki-search-1.0.0-jar-with-dependencies.jar 
     -jar content... 

estoy usando el plugin de montaje, y el descriptor predefinido "jar-con-dependencias" para crear mi archivo jar ejecutable.

Estoy especificando una entrada de complemento de ensamblaje por separado en mi pom, haciendo referencia a un descriptor personalizado para intentar crear el archivo zip distribuible.

Así que la parte de mi pom se parece a esto:

<plugin> 
<artifactId>maven-assembly-plugin</artifactId> 
<configuration> 
    <descriptorRefs> 
    <descriptorRef>jar-with-dependencies</descriptorRef> 
    </descriptorRefs> 
    <archive> 
    <manifest> 
    <mainClass>quicksearch.QuickSearchApp</mainClass> 
    </manifest> 
    </archive> 
</configuration> 
<executions> 
    <execution> 
    <id>make-assembly</id> 
    <phase>package</phase> 
    <goals> 
    <goal>attached</goal> 
    </goals> 
    </execution> 
</executions> 
</plugin> 
<plugin> 
<artifactId>maven-assembly-plugin</artifactId> 
<configuration> 
    <descriptors> 
    <descriptor>src/main/assembly/dist.xml</descriptor> 
    </descriptors> 
</configuration> 
<executions> 
    <execution> 
    <id>make-assembly</id> 
    <phase>package</phase> 
    <goals> 
    <goal>attached</goal> 
    </goals> 
    </execution> 
</executions> 
</plugin> 

Y mi descriptor de costumbre se ve así:

<assembly> 
    <id>dist</id> 
    <formats> 
    <format>tar.gz</format> 
    <format>tar.bz2</format> 
    <format>zip</format> 
    </formats> 
    <fileSets> 
    <fileSet> 
     <includes> 
     <include>${project.basedir}/target/wiki-search-0.0.1-SNAPSHOT-jar-with-dependencies.jar</include> 
     </includes> 
     <outputDirectory>.</outputDirectory> 
    </fileSet> 
    <fileSet> 
     <directory>${project.basedir}/src/main/etc</directory> 
     <includes> 
     <include>*</include> 
     </includes> 
    <outputDirectory></outputDirectory> 
    </fileSet> 
    </fileSets> 
</assembly> 

Todo funciona bien. El jar-with-dependence se está construyendo. Mi archivo zip dist se está construyendo. Pero el archivo zip dist no contiene el archivo jar-with-dependencies.

Respuesta

43

Con su configuración existente, se fusionarán sus dos configuraciones separadas para el complemento de ensamblaje, y las configuraciones también se fusionarán.

Para lograr su objetivo, debe definir una sola configuración de ensamblaje-complemento con múltiples ejecuciones anidadas, luego defina la configuración para cada ejecución dentro de ella. El complemento de ensamblaje ejecutará cada ensamblaje secuencialmente, por lo que el contenedor jar-with-dependencies estará disponible para su inclusión en el contenedor dist. También tenga en cuenta que el objetivo attached está en desuso en favor del objetivo single.

También tenga en cuenta que las rutas en el ensamblaje son relativas a la raíz, y para incluir un archivo particular, debe usar el elemento <files> en lugar del elemento <filesets>. También puede especificar propiedades en el conjunto para que sea menos frágil de cambiar.

La configuración reordenado y el montaje de abajo debe hacer lo que está buscando:

descriptor Asamblea:

<assembly> 
    <id>dist</id> 
    <formats> 
    <format>tar.gz</format> 
    <format>tar.bz2</format> 
    <format>zip</format> 
    </formats> 
    <files> 
    <file> 
     <source> 
     target/${project.artifactId}-${project.version}-jar-with-dependencies.jar 
     </source> 
     <outputDirectory>/</outputDirectory> 
    </file> 
    </files> 
    <fileSets> 
    <fileSet> 
     <directory>${project.basedir}/src/main/resources</directory> 
     <includes> 
     <include>*</include> 
     </includes> 
    <outputDirectory>/</outputDirectory> 
    </fileSet> 
    </fileSets> 
</assembly> 

complemento Asamblea:

<plugin> 
<artifactId>maven-assembly-plugin</artifactId> 
<executions> 
    <execution> 
    <id>jar-with-dependencies</id> 
    <phase>package</phase> 
    <goals> 
    <goal>single</goal> 
    </goals> 
    <configuration> 
    <descriptorRefs> 
    <descriptorRef>jar-with-dependencies</descriptorRef> 
    </descriptorRefs> 
    <archive> 
    <manifest> 
     <mainClass>quicksearch.QuickSearchApp</mainClass> 
    </manifest> 
    </archive> 
    </configuration> 
    </execution> 
    <execution> 
    <id>dist</id> 
    <phase>package</phase> 
    <goals> 
    <goal>single</goal> 
    </goals> 
    <configuration> 
    <descriptors> 
    <descriptor>src/main/assembly/dist.xml</descriptor> 
    </descriptors> 
    </configuration> 
    </execution> 
</executions> 
</plugin> 
+3

+1 muy agradable y detallada respuesta –

+0

Leyenda . Trabajó por primera vez. Aclamaciones. – Ben

+0

¡Gracias! ¿Hay alguna manera de lograr esto sin asociar la ejecución al ciclo de vida predeterminado? Solo omitir los elementos de 'fase' y 'objetivos' no funcionó para mí. –

0

Tiene dos configuraciones diferentes para el complemento de ensamblaje, y desea que se ejecuten en orden (jar antes que zip), pero no creo que Maven implique ningún orden sobre cómo se resolverá. Mi suposición es que el archivo zip se está generando antes del archivo JAR.

Incluso si ese no es el caso, le sugiero que cree un módulo por artefacto. Mueva el ensamblaje JAR a su propio módulo y haga que el módulo ahora solo con cremallera dependa de él. De esta forma, la resolución de la orden de dependencia de Maven puede activarse y desarrollarse en orden.

Cuestiones relacionadas