2009-09-09 69 views
1

我的項目使用了很多程序集,因此我只對程序集感興趣。 在執行mvn install與assembly之外,我得到默認的打包.jar。 我該如何避免這種情況?Maven-2:避免默認打包?


我有一個類似於你所提供的pom.xml。 上執行MVN安裝,我越來越App1.jar,App2.jar,以及包含快照JAR中的所有內容

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.2-beta-2</version> 
      <executions> 
       <execution> 
        <id>assemblyone</id> 
        <phase>compile</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
        <configuration> 
         <finalName>App1</finalName> 
         <appendAssemblyId>false</appendAssemblyId> 
         <descriptors> 
          <descriptor>${basedir}/src/main/resources/assemblies/report.xml</descriptor> 
         </descriptors> 
        </configuration> 
       </execution> 
       <execution> 
        <id>assemblytwo</id> 
        <phase>compile</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
        <configuration> 
         <finalName>App2</finalName> 
         <appendAssemblyId>false</appendAssemblyId> 
         <descriptors> 
          <descriptor>${basedir}/src/main/resources/assemblies/src.xml</descriptor> 
         </descriptors> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

我怎樣才能避免這種快照(不知道確切的術語)的容器,並確保只有組件創建?

回答

2

我可以用兩種方法來閱讀你的問題,我已經在下面概述了答案。如果兩者都不正確,請問您是否可以修改您的問題。

1)你的意思是你有一個默認(jar)包裝的項目,並且你想避免在沒有定義組件時創建jar嗎?如果是這種情況,如果沒有定義組件,構建會達到什麼效果?

2)您是否意味着您正在運行mvn assembly:assembly來生成程序集並想知道如何在運行安裝目標時獲取該程序集?


對於第二種情況,可以在組裝插件綁定到一個生命週期階段,以確保它始終運行,如果指定<appendAssemblyId>應該是假的,那麼組件將取代默認的罐子。

例如,這種配置將調用在包裝階段的組裝插件和替換默認罐子:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2-beta-2</version> 
    <executions> 
    <execution> 
     <phase>package</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
     <configuration> 
     <appendAssemblyId>false</appendAssemblyId> 
     <descriptors> 
      <descriptor>src/main/assembly/archive.xml</descriptor> 
     </descriptors> 
     </configuration> 
    </execution> 
    </executions> 
</plugin>  

有關選項1,這實際上是相當棘手的事情。我能想到的最好的方法是指定項目使用pom打包,並使用通常綁定到jar生命週期的執行來配置項目profile。您需要配置的生命週期綁定列在introduction to the build lifecycle

0

我不確定您是否真的可以通過非常簡單的方式實現該功能。

一種解決方法是調用clean插件一旦構建實現,通過這樣做:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-clean-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>auto-clean</id> 
        <phase>package</phase> 
        <goals> 
         <goal>clean</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    ... 
</build> 

這樣,在target/目錄中創建的JAR將在Maven2的執行結束時被刪除。

但是,您將不得不定義另一個目錄來存儲由Maven2創建的程序集。否則,它將被clean插件的調用來刪除...如果你想將它們存儲在目錄assemblies-target/,您可以添加在pom.xml文件:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2-beta-4</version> 
    <configuration> 
     ... 
     <!-- Copy the ZIP in target/ of the ROOT directory. --> 
     <outputDirectory>assemblies-target</outputDirectory> 
    </configuration> 
    ... 
0

我認爲這將是更如果您向我們展示了您的整個POM和正在構建的工件,請清楚。我只能猜測問題是什麼,因爲你的術語不是我所熟悉的。這是我對這個問題的猜測:你有一個配置好的POM來生成兩個程序集JAR,但是你得到了POM本身的第三個JAR。換句話說,如果您的POM的artifactId是MyApp,那麼除了您實際需要的兩個JAR之外,您還將獲得MyApp-1.0.0.jar或類似的內容。

如果是這樣,問題歸結爲您正在使用Maven從單個模塊創建多個工件。 Maven被設計爲從每個模塊中只產生一個主要的工件。我會做的是將您的POM更改爲包裝類型爲「pom」,並在名爲App1和App2的<modules>部分中給它兩個模塊。在你的模塊下創建子目錄,每個應用程序一個。給他們每個POM配置一個單一的裝配,包裝類型的「罐子」。移動代碼/文件/等。適當地放入每個子模塊中,這樣就不會有任何剩餘的父模塊。使用Maven,如果你發現自己從一個模塊(你是)生成兩個工件,你應該首先考慮你可能違反了Maven的最佳實踐並重新安排了一些東西,這樣你只能爲每個模塊生成一個工件。

請讓我知道如果這沒有意義,我會盡力澄清。

+0

嗨 感謝您的inputs.i不認爲我能夠創建單獨的模塊說App1,App2..bcoz我的程序集罐子,即App1.jar,App2.jar有共同的文件被包括在內。 如果我將packagins指定爲'pom',MyApp-1.0.0 jar將不會被創建? – user170114 2009-09-16 11:22:10

+0

那麼,那些常見的文件將被放置在第三個位置,或者在它們自己的組件中被解壓到每個模塊中,或者被放在父模塊中並且被每個孩子引用(不那麼幹淨)。標記你的父模塊一個「POM」不會創建JAR,但是,你仍然會違反Maven的原則而沒有按照我的建議去做。搜索「Maven:權威指南」 - 一本關於Maven的免費書籍。 – SingleShot 2009-09-16 16:30:22

+0

謝謝..我想我需要去選擇將這些常用軟件包放入父母並從孩子訪問。 在這種情況下,我應該在哪裏保留我的程序集描述符?在父/子程序集下?如何指向父文件夾..我不能使用-project.build.outputDirectory對嗎? – user170114 2009-09-17 05:51:02