2009-10-05 25 views
27

我有一個項目,我試圖創建一個分佈zip文件,其中包含(其他文件)與我的java項目的依賴關係的可執行jar。maven-assembly插件 - 如何創建嵌套程序集

所以我有點希望它看起來是這樣的:

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

我使用的組件插件,以及預定義的描述符「JAR-與依賴性」創建我的可執行的JAR文件。

我在我的pom中指定了一個單獨的程序集插件條目,引用自定義描述符來嘗試構建可分發的zip文件。

所以我的聚甲醛的部分看起來像這樣:

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

而且我自定義的描述是這樣的:

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

,一切工作正常。 jar-with-dependencies正在構建中。我的dist zip文件正在建立中。但dist zip文件不包含jar-with-dependencies文件。

回答

43

使用您現有的配置,彙編插件的兩個單獨配置將被合併,配置也將被合併。

爲了實現您的目標,您應該定義一個帶有多個嵌套執行的程序集插件配置,然後爲其中的每個執行定義配置。然後程序集插件將按順序執行每個程序集,因此jar-with-dependencies jar將可用於包含在dist jar中。還請注意attached目標已被棄用,以支持single目標。

另請注意,程序集中的路徑相對於根目錄,並且要包含特定文件,應使用<files>元素而不是<filesets>元素。您還可以在程序集中指定屬性,使其不易變更。

重排的配置和組裝之下應該做你以後:

裝配描述:

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

Assembly插件:

<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非常好的,詳細的解答 – 2009-10-06 10:12:24

+0

傳奇。第一次工作。乾杯。 – Ben 2009-10-06 21:09:33

+0

謝謝!有沒有辦法在不將執行附加到默認生命週期的情況下實現這一點?只是省略「階段」和「目標」元素對我而言並不適用。 – 2010-04-26 09:34:34

0

對於程序集插件,您有兩種不同的配置,並且您希望它們按順序運行(zip之前的jar),但我不認爲Maven意味着如何解決此問題的任何順序。我的猜測是在JAR文件之前生成了zip文件。

即使情況並非如此,我建議您爲每個工件創建一個模塊。將JAR程序集移到它自己的模塊中,並且現在只有Zip模塊依賴於它。這樣,Maven的依賴性訂單解析可以按順序啓動並構建它們。