2009-10-05 20 views
27

Ho un progetto con cui sto cercando di creare un file zip di distribuzione, che contiene (tra gli altri file) un jar eseguibile con dipendenze del mio progetto java.plugin maven-assembly - come creare assembly nidificati

Così ho sorta di voglia farlo sembrare come questo:

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

Sto usando il plugin di montaggio, e il descrittore predefinito "vaso-con-le dipendenze" per creare il mio file jar eseguibile.

che sto specificando una voce di plug-assembly separato nel mio pom, fa riferimento a un descrittore personalizzato per cercare di costruire il file zip distribuibile.

Quindi la parte del mio pom assomiglia a questo:

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

E il mio descrittore personalizzato assomiglia a questo:

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

tutto funziona bene. Il jar-with-dipendencies è in fase di costruzione. Il mio file zip dist è in fase di costruzione. Ma il file zip dist non contiene il file jar-with-dependencies.

risposta

43

Con la configurazione esistente, le due configurazioni separate per il plug-in dell'assieme verranno unite e le configurazioni verranno unite.

Per raggiungere l'obiettivo, è necessario definire una configurazione di singolo assembly-plugin con più esecuzioni nidificate, quindi definire la configurazione per ciascuna esecuzione al suo interno. Il plugin complesso eseguirà quindi ciascun complesso sequenza, quindi il vaso jar-with-dependencies sarà disponibile per l'inclusione nel vaso dist. Si noti inoltre l'obiettivo attached è deprecato a favore del single obiettivo.

Si noti inoltre che i percorsi nell'assieme sono relativi alla radice e, per includere un particolare file, è necessario utilizzare l'elemento <files> anziché l'elemento <filesets>. È anche possibile specificare le proprietà nell'assieme per renderlo meno fragile da modificare.

La configurazione riarrangiato ed il montaggio di seguito dovrebbe fare quello che stai dopo:

Assemblea descrittore:

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

plug-in Assemblea:

<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 risposta molto bello e dettagliato –

+0

Leggenda . Ha funzionato la prima volta. Saluti. – Ben

+0

Grazie! C'è un modo per ottenere ciò senza collegare l'esecuzione al ciclo di vita predefinito? Solo omettere gli elementi "fase" e "obiettivi" non ha funzionato per me. –

0

Si dispone di due diverse configurazioni per il plug-in di assemblaggio e si desidera eseguirle in ordine (jar prima di zip), ma non penso che Maven implichi alcun ordine in merito alla risoluzione. La mia ipotesi è che il file zip venga generato prima del file JAR.

Anche se questo non è il caso, vorrei suggerire di creare un modulo per artefatto. Spostare l'assembly JAR nel proprio modulo e fare in modo che il modulo ora solo Zip dipenda da esso. In questo modo la risoluzione degli ordini di dipendenza di Maven può dare il via e costruirli in ordine.

Problemi correlati