2012-01-04 151 views
23

我有一個有多個主類的maven項目。我想從這些項目中生成可運行的Jars(包括alle依賴)。我目前有以下構建配置(使用maven.assembly):從單個Maven項目創建多個可運行Jars(包括依賴項)

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
      <archive> 
       <manifest> 
        <mainClass>classpath.to.my.mainClass</mainClass> 
       </manifest> 
      </archive> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
    </plugin> 
</plugins> 
</build> 

是他們的方式來實現maven組裝?如果沒有,達到目標的最簡單方法是什麼?

+0

您是否嘗試過爲不同配置的'maven-assembly-plugin'創建幾個''條目?這會觸發這個插件兩次,並希望創建兩個JAR文件... – 2012-01-04 14:51:49

+0

@dma_k按照您的建議,嘗試生成三個JAR,前兩個JAR文件被最後的''配置覆蓋。 – anon 2013-01-14 18:19:56

+0

試着玩''配置選項(勾選[這裏](http://maven.apache.org/plugins/maven-assembly-plugin/howto.html))。 – 2013-01-15 15:08:00

回答

18

我沒能解決這個問題,在一個令人滿意的方式maven-assembly-plugin,所以我去了不同的解決方案。我用onejar-maven-plugin

<build> 
    <plugins> 
    <plugin> 
    <groupId>org.dstovall</groupId> 
    <artifactId>onejar-maven-plugin</artifactId> 
    <version>1.4.4</version> 
    <executions> 
     <execution> 
     <id>build-first</id> 
      <configuration> 
      <mainClass>classpath.to.first.Main</mainClass> 
      <attachToBuild>true</attachToBuild> 
      <classifier>onejar</classifier> 
      <filename>first-runnable.jar</filename> 
      </configuration> 
      <goals> 
      <goal>one-jar</goal> 
      </goals> 
     </execution> 
     <execution> 
     <id>build-second</id> 
      <configuration> 
      <mainClass>classpath.to.second.Main</mainClass> 
      <attachToBuild>true</attachToBuild> 
      <classifier>onejar</classifier> 
      <filename>second-runnable.jar</filename> 
      </configuration> 
      <goals> 
      <goal>one-jar</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

<pluginRepositories> 
    <pluginRepository> 
    <id>onejar-maven-plugin.googlecode.com</id> 
    <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url> 
    </pluginRepository> 
</pluginRepositories> 
+1

兩個'execution'中的兩個'id'不應該是不同的嗎?我的maven抱怨,如果我有多次相同的id。 – 2012-02-21 12:11:58

+0

@AndreHolzner:是的,這是一個錯誤 – 2012-02-22 09:59:30

+1

恕我直言,maven-assembly-plugin也可以做到這一點。請參閱@ donal-fellows答案 – Gabriel 2015-04-09 07:46:29

19

你可以做到。您需要爲您正在構建的每件工件單獨執行一次(即,爲每個工件分配自己的ID,但可以將相位保留爲默認值),並且需要指定finalName和archive/manifest/mainClass 每個

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>build-a</id> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>foobar.Aclass</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>foobar_a.jar</finalName> 
      </configuration> 
      </execution> 
      <execution> 
      <id>build-b</id> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>foobar.Bclass</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>foobar_b.jar</finalName> 
      </configuration> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 
</build> 
+2

它可能也應該明確聲明要使用「單個」目標。 – 2012-01-04 12:45:10

+3

從嘗試此解決方案和[這裏發佈](http://stackoverflow.com/a/15799254/288875),它看起來像還需要添加''和''標籤? – 2013-06-25 12:24:35

+0

我編輯了這篇文章(等待同行評議),包括目標和階段標籤。 – Gabriel 2015-04-09 07:44:39

1

要指定多一點以前的答案,這是對我很有幫助, 你需要添加相包和目標組裝和運行mvn運行清潔套裝,POM如下:

<plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>build-a</id> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>firstMainClass</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <finalName>a.jar</finalName> 
        </configuration> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>build-b</id> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>SecondMainClass</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <finalName>b.jar</finalName> 
        </configuration> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
+2

目標'組裝'已棄用。查看[插件信息](https://maven.apache.org/plugins/maven-assembly-plugin/plugin-info.html)。 代替使用'single'更好。 – Gabriel 2015-04-09 07:43:59

6

The top answer如果你不使用被打包到你的JAR文件(例如,配置Spring框架的自動綁定)的任何配置(或任何資源,對於這個問題)工作

幸運的是,此解決方案也可以與maven-shade-plugin一起使用,並且您沒有上述問題與onejar-maven-plugin

此外,maven-shade-plugin正在積極維持,而不是onejar-maven-plugin這是在googlecode煉獄。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.1</version> 
    <executions> 
    <execution> 
     <id>build-first</id> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
      <mainClass>classpath.to.first.Main</mainClass> 
      </transformer> 
     </transformers> 
     <finalName>first-runnable</finalName> 
     </configuration>   
    </execution> 
    <execution> 
     <id>build-second</id> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
      <mainClass>classpath.to.second.Main</mainClass> 
      </transformer> 
     </transformers> 
     <finalName>second-runnable</finalName> 
     </configuration> 
    </execution> 
    </executions> 
</plugin>