2009-10-05 7 views
27

J'ai un projet dans lequel j'essaye de créer un fichier zip de distribution, qui contient (parmi d'autres fichiers) un fichier exécutable avec les dépendances de mon projet java.maven-assembly plugin - comment créer des assemblages imbriqués

Je veux en quelque sorte à ressembler à ceci:

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

J'utilise le plugin de montage, et le descripteur prédéfini « jar-with-dépendances » pour créer mon fichier jar exécutable.

Je spécifie une entrée de plugin d'assembly séparée dans mon pom, référençant un descripteur personnalisé pour essayer de construire le fichier zip distribuable.

Ainsi, la partie de mon pom ressemble à ceci:

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

Et mon descripteur personnalisé ressemble à ceci:

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

Tout fonctionne très bien. Le pot avec dépendances est en cours de construction. Mon fichier zip dist est en cours de construction. Mais le fichier zip dist ne contient pas le fichier jar-with-dependencies.

Répondre

43

Avec votre configuration existante, vos deux configurations distinctes pour le module d'assemblage seront fusionnées et les configurations seront également fusionnées.

Pour atteindre votre objectif, vous devez définir une seule configuration d'assembly-plugin avec plusieurs exécutions imbriquées, puis définir la configuration pour chaque exécution à l'intérieur. Le plugin d'assemblage exécutera ensuite chaque assemblage séquentiellement, ainsi le pot jar-with-dependencies sera disponible pour être inclus dans le pot dist. Notez également que l'objectif attached est déprécié en faveur de l'objectif single.

Notez également que les chemins dans l'assembly sont relatifs à la racine et pour inclure un fichier particulier, vous devez utiliser l'élément <files> plutôt que l'élément <filesets>. Vous pouvez également spécifier des propriétés dans l'assemblage pour le rendre moins fragile à modifier.

La configuration réarrangée et le montage ci-dessous devrait faire ce que vous êtes après:

descripteur de montage:

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

plugin Assemblée:

<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 très belle et réponse détaillée –

+0

Légende . A travaillé la première fois. À votre santé. – Ben

+0

Merci! Existe-t-il un moyen d'y parvenir sans attacher l'exécution au cycle de vie par défaut? Le simple fait d'omettre les éléments «phase» et «objectifs» n'a pas fonctionné pour moi. –

0

Vous avez deux configurations différentes pour le plug-in d'assemblage, et vous voulez les exécuter dans l'ordre (jar avant zip), mais je ne pense pas que Maven implique un ordre dans la façon dont cela sera résolu. Ma conjecture est que le fichier zip est en cours de génération avant le fichier JAR.

Même si ce n'est pas le cas, je vous suggère de créer un module par artefact. Déplacez l'assemblage JAR dans son propre module et faites dépendre le module now Zip-only. De cette façon, la résolution de l'ordre de dépendance de Maven peut démarrer et les construire dans l'ordre.

Questions connexes