2013-05-31 43 views
1

我想創建一個多項目maven項目的單個可執行jar。這是我的項目結構,接下來是我試圖用maven assembly插件做的事情。將會很感激任何人都可以暗示我的解決方案(這在我看來最爲普遍,但在其他討論鏈中找不到)。謝謝!多項目maven項目的單個可執行jar

我是(簡體)的結構:

對myApp

… 
    <groupId>myApp</groupId> <artifactId>myApp</artifactId> 
    <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> 
    <name>myApp</name> <url>http://maven.apache.org</url> 
… 
    <build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
     <source>1.6</source> <target>1.6</target> 
     </configuration> 
    </plugin> 
     </plugins> 
    </build> 

    <modules> 
    <module>../m1</module> <!-- jar--> 
    <module>../m2</module> <!-- war --> 
    <module>../subAppPomAggregationProject</module> 
    </modules> 

    <dependencies> 
… 
    </dependencies> 
</project> 

我想下面的插件添加到MyApp POM文件:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.4</version> 
<configuration> 
    <appendAssemblyId>false</appendAssemblyId> 
     <archive> 
     <manifest> 
      <mainClass>com.mypath.Main</mainClass> 
     </manifest> 
     </archive> 
     <descriptorRefs> 
    <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
</configuration> 
<executions> 
    <execution> 
     <id>make-assembly</id> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
    </execution> 
</executions> 
</plugin> 

當然事實並非如此爲MyApp創建一個jar,但它確實在每個模塊(!)中創建了一個似乎是聚集的jar的東西,儘管不是所有的依賴關係都是如此。

我也嘗試創建另一個具有模塊或MyApp依賴項的超級項目(jar) - 也沒有工作。我是否應該在uber-jar中列出導入到MyApp的所有模塊(以及導入到subAppPomAggregationProject中的模塊)?沒有嘗試過,但如果是這樣的話 - pom聚合器的目的是什麼,爲什麼使用兩階段編譯/彙總方法?

我無法嘗試maven-shade-plugin(不知道它是否有幫助),因爲它需要maven 3,我目前正在使用2.2.1(在我的近乎里程碑之前不想升級和晃動東西...)。

回答

0

如果陰影插件可以使用較舊的版本。 版本1.7.1是在Maven 2.x上工作的最後一個版本,它將用於創建可執行的jar文件...語法應該幾乎相同,主要版本號的開關是指示作爲要求切換到Maven 3。

+0

添加我這個插件在MyApp的pom.xml文件(POM包裝),或做我創建另一個項目(比如說myappjar),我在其中放置插件?如果是後者,我只需將MyApp的依賴項放入myappjar pom.xml中? – Gera

+0

每個模塊一個工件。所以,不要劫持您的聚合器(也家長必須在孩子面前內置所以不能有這樣即使你想) –

+0

當我加入陰影插件MyApp的pom.xml中,我得到了以下錯誤:[INFO ]用陰影工件替換原始工件。 [INFO]用/home/.../MyApp/target/myapp-0.0.1-SNAPSHOT-shaded.pom取代null [錯誤]構建錯誤 [INFO]創建着色jar時出錯:null。很明顯,解決方案不起作用。將嘗試第二個選項。 – Gera

0

在這樣的環境中工作的解決方案方法是分層聚合。所以,首先由 創建subAppPomAggregationProject一個jar創造說subAppPomAggregationProject.aggregate Maven項目,並在其POM指定所有subAppPomAggregationProject模塊作爲依賴, 並添加Maven的組裝插件:

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.4</version> 
     <configuration> 
      <appendAssemblyId>false</appendAssemblyId> 
      <descriptors> 
       <descriptor>src/assembly/bin.xml</descriptor> 
      </descriptors> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
     <executions> 
      <execution> 
       <id>make-assembly</id> 
       <phase>package</phase> 
       <goals> 
       <goal>single</goal> 
       </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
</build>] 

然後做同樣的在應用層面 - 在創建subAppPomAggregationProject聚集罐子是一個模塊!

因爲在每個級別上,依賴關係之間的衝突得到解決,所以沒有任何依賴關係會在下一級別聚合中造成衝突 (因爲它們已經出現在它們的單個罐子裏......或者沿着這些線條出現:-) )。

相關問題