2015-12-30 59 views
0

我有一個多模塊maven項目(比如project-xxx)。可以說,它由5個模塊:如何在Maven構建過程中創建其他jar文件幷包含所有模塊的內容?

project-xxx (war) 
--> module-1 (jar) 
--> module-2 (jar) 
--> module-3 (jar) 
--> module-4 (jar) 
--> module-5 (jar) 

當Maven項目建成後,生成war文件,它包括5個模塊的jar文件也是如此。現在,爲了不同的目的(即部署到分佈式緩存,所以我們可以從命令行運行查詢),我想生成一個`jar'文件,其中包括所有模塊中的java類。我知道,產生一個以上的工件是違反maven的哲學的,我讀到SO上的這個blog postfew otherquestions

但是創建這個單獨的jar文件將大大簡化我的項目中的其他一些事情。什麼是最好的方法來生成這個單一的jar文件?

回答

1

我是贊成每個Maven項目約定中的一個工件。話雖這麼說,如果你需要一個單一產物包含所有類的所有模塊的,然後做一個專門的單個項目這樣做:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>your-group-id</groupId> 
    <artifactId>one-jar-to-rule-them-all</artifactId> 
    <version>your-version</version> 
    <dependencies> 
     <dependency> 
      <groupId>your-group-id</groupId> 
      <artifactId>module-1</artifactId> 
      <version>your-version</version> 
     </dependency> 
     . 
     . 
     . 
     <dependency> 
      <groupId>your-group-id</groupId> 
      <artifactId>module-5</artifactId> 
      <version>your-version</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>2.4.2</version> 
       <configuration> 
        <!-- 
         This restricts the jar to classes from your group; 
         you may or may not want to do this. 
        --> 
        <artifactSet> 
         <includes> 
          <include>your-group-id</include> 
         </includes> 
        </artifactSet> 
        <createDependencyReducedPom>true</createDependencyReducedPom> 
       </configuration> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

這個例子項目取決於每個模塊上然後使用maven-shade-plugin將所有這些模塊組合到一個jar工件中。你也可以把它作爲你父母project-xxx的孩子模塊,這樣它就可以被反應堆建成。這樣,您可以同時擁有一個war和一個uber jar,但仍然保持標準Maven構建的模塊化。

+1

謝謝!我幾乎是在相同的方向,但沒有意識到「陰影」插件。那是失蹤的一塊。 –

1

我想你應該考慮引入第一個單獨的配置文件,以便profile1包含配置以產生適當的戰爭包裝。 Profile2可以包含使用maven-shade-plugin的配置,以便從現有模塊中創建UBER jar。配置文件是一種非常乾淨而且可以分解不同問題的方式。

對於maven配置文件,請參閱here。對於maven-shade-plugin,請參見here

希望有所幫助。

+0

對於我的要求,創建一個新的模塊,如@heenenee在[answer](https://stackoverflow.com/a/34536316/1128163)中所述,似乎更適合。感謝「陰影」插件指針。 –

相關問題