2012-01-04 87 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>