2009-08-25 321 views
15

我使用程序集插件創建了幾個帶有一些類的jar。我需要得到的罐子自定義名稱:app_business.jarapp_gui.jarcore.jar添加Maven-assembly-plugin:自定義jar文件名

目前我有以下配置:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
     <appendAssemblyId>false</appendAssemblyId> 
    <finalName>app_business</finalName> 
     <descriptors> 
      <descriptor>assembly.xml</descriptor> 
     </descriptors> 
     <attach>true</attach> 
    </configuration> 
    <executions> 
     <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

一個的assembly.xml文件:

<assembly> 
     <id>app_business</id> 
     <formats> 
     <format>jar</format> 
     </formats> 
     <baseDirectory>target</baseDirectory> 
     <includeBaseDirectory>false</includeBaseDirectory> 

     <fileSets> 
     <fileSet> 
      <directory>${project.build.outputDirectory}</directory> 
      <outputDirectory></outputDirectory> 
      <includes> 
      <include>org/xyz/**</include> 
      </includes> 
     </fileSet>  
     </fileSets> 
    </assembly> 

這將創建一個文件app_business.jar這是完美的。但我不知道如何創建我的其他文件。選項appendAssemblyId不能幫助我,因爲它以AppName-app_business.jar格式創建文件名。我真的需要確切的文件名app_business.jar

任何想法?非常感謝你!

回答

-1

標準的maven插件是用於一般的重複性工作。他們從POM收集所有信息,他們很聰明(從你不需要配置太多的角度來看)。

如果您需要特殊任務,那麼我建議使用ant plugin,它允許您在POM中嵌入一段Ant代碼。這使您可以運行jar task

+0

我不喜歡混合使用ant和maven任務。無論如何,使用ant任務需要更少的xml配置。 (約20行我的工作) – Synox 2009-08-25 09:01:43

+3

@Synox,你不應該避免antrun插件,它是非常有用的填補在Maven的差距,而無需滾動自己的插件。我只是傾向於發現,當有更多的Mavenic(不管是什麼,Maven相當於Pythonic)的方式來做這件事的時候,人們總是喜歡使用它。在這種情況下,我認爲程序集插件*應該是更好的選擇,但正如你從我的答案中可以看到的那樣,似乎仍然存在一些問題,阻止它完全按照OP的要求工作。 – 2009-08-25 13:51:46

+0

使用ant很容易推出maven插件。 – 2010-07-27 19:59:26

38

您可以將配置元素移動到插件聲明的執行元素下面。這意味着配置將僅適用於該執行。然後,您可以爲其他程序集添加其他程序集插件的執行。

下面是已修改的配置的具有兩個執行,每個引用一個不同組件的一個示例:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <executions> 
    <execution> 
     <id>make-business-assembly</id> 
     <phase>package</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
     <configuration> 
     <appendAssemblyId>false</appendAssemblyId> 
     <finalName>app_business</finalName> 
     <descriptors> 
      <descriptor>src/main/assembly/business-assembly.xml</descriptor> 
     </descriptors> 
     <attach>true</attach> 
     </configuration> 
    </execution> 
    <execution> 
     <id>make-gui-assembly</id> 
     <phase>package</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
     <configuration> 
     <appendAssemblyId>false</appendAssemblyId> 
     <finalName>app_gui</finalName> 
     <descriptors> 
      <descriptor>src/main/assembly/gui-assembly.xml</descriptor> 
     </descriptors> 
     <attach>true</attach> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

根據該結構,兩個附加的罐子(表觀_business.jar和應用程式_gui.jar)將被創建在目標目錄中,雖然請注意,如果您安裝了該項目,只安裝最後一個工件(這當然會成爲問題)。

要避免這種情況,您需要將appendAssemblyId屬性更改爲true。在這種情況下,您可以得到最接近的結果是將finalNames更改爲「app」,將ID更改爲「gui」和「business」,從而導致app-gui.jar和app-business.jar被打包並且所有工件都被安裝。

+0

嘿,謝謝你真的很快回復!它的工作原理是 。正如你所說在控制檯上有警告,最後一件神器變成了主神器。 我可以忍受這一點,但我不喜歡控制檯上的警告。有沒有辦法隱藏它們(或配置程序集這樣做)? – Synox 2009-08-25 08:43:52

+0

有什麼警告? 我的答案的最後一部分討論了主要構件問題,如果您可以忍受從下劃線更改爲連字符 – 2009-08-25 09:03:11

+1

警告: [警告]配置選項:'appendAssemblyId'設置爲false,'classifier'丟失。 而不是附加程序集文件:... \ app_business.jar,它將成爲主項目工件的文件。 注意:如果爲此項目提供了多個描述符或描述符格式,則此文件的值將是非確定性的! [警告]替換預先存在的項目主工件文件:... \ app_gui.jar 和程序集文件:.... \ app_gui.jar 我想避免必須從下劃線更改爲超鏈節。但如果我無法避免......這個解決方案是相當不錯的。 – Synox 2009-08-25 10:45:28