Java 从单个Maven项目创建多个可运行JAR(包括依赖项)

Java 从单个Maven项目创建多个可运行JAR(包括依赖项),java,maven,executable-jar,maven-assembly-plugin,Java,Maven,Executable Jar,Maven Assembly Plugin,我有一个maven项目,它有多个主类。我想从这些项目中生成可运行的JAR(包括所有依赖项)。我目前有以下构建配置(使用maven.assembly): maven汇编插件 classpath.to.my.main类 带有依赖项的jar 他们是通过maven assembly实现这一目标的方法吗?如果没有,实现目标的最简单方法是什么?你可以做到。您将需要为正在构建的每个工件单独执行一次(即,为每个工件提供自己的id,但您可以将该阶段保留为默认),并且需要为每个工件指定finalName和arc

我有一个maven项目,它有多个主类。我想从这些项目中生成可运行的JAR(包括所有依赖项)。我目前有以下构建配置(使用maven.assembly):


maven汇编插件
classpath.to.my.main类
带有依赖项的jar

他们是通过maven assembly实现这一目标的方法吗?如果没有,实现目标的最简单方法是什么?

你可以做到。您将需要为正在构建的每个工件单独执行一次(即,为每个工件提供自己的id,但您可以将该阶段保留为默认),并且需要为每个工件指定finalName和archive/manifest/main类


maven汇编插件
构建
foobar.Aclass
带有依赖项的jar
foobar_a.jar
构建-b
foobar.b类
带有依赖项的jar
foobar_b.jar

我无法用
maven assembly插件以令人满意的方式解决这个问题,所以我选择了另一种解决方案。我使用了:


org.dstowall
onejar maven插件
1.4.4
先建
classpath.to.first.Main
真的
奥内贾尔
first-runnable.jar
一罐
建立第二
classpath.to.second.Main
真的
奥内贾尔
second-runnable.jar
一罐
onejar-maven-plugin.googlecode.com
http://onejar-maven-plugin.googlecode.com/svn/mavenrepo

要详细说明之前对我很有帮助的答案, 您需要添加阶段包和目标组装,并运行mvn run clean包,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>

maven汇编插件
构建
头等舱
带有依赖项的jar
a、 罐子
包裹
装配
构建-b
二等舱
带有依赖项的jar
b、 罐子
包裹
装配
如果您没有使用绑定到jar文件中的任何配置(或任何资源)(例如,Spring Framework自动绑定的配置),则可以工作

幸运的是,此解决方案也适用于
maven shade plugin
,而
onejar maven plugin
没有上述问题

另外,
maven-shade-plugin
正在积极维护,而
onejar-maven-plugin
则处于谷歌代码的炼狱中


org.apache.maven.plugins
maven阴影插件
2.4.1
先建
包裹
阴凉处
classpath.to.first.Main
首次运行
建立第二
包裹
阴凉处
classpath.to.second.Main
第二次运行

它可能还应该明确声明要使用
单个
目标。通过尝试此解决方案和另一个解决方案,看起来还需要添加
标记?我编辑了这篇文章(等待同行评审),以包括目标和阶段标记。是否也可以同时安装它们?通过向工件添加后缀?这两个罐子是否也可以通过shade插件最小化?您是否尝试过为
maven assembly plugin
创建几个配置不同的
条目?这将触发此插件两次并创建两个JAR文件,希望…@dma_k按照您的建议,尝试生成三个JAR,前两个JAR被最后一个
配置覆盖。尝试使用
配置选项(选中).两个
执行
s中的两个
id
s不应该不同吗?如果我不止一次拥有相同的id,我的maven会抱怨。@AndreHolzner:是的,这是一个错误,maven汇编插件也可能发生同样的事情。请参阅@donal fellows answer如果需要不同的id来唯一标识不同的JAR,则应使用以下内容替换插件存储库:redhat earlyaccess repository maven.repository.redhat.com/earlyaccess/all/Goal
assembly
已弃用。看见最好改用
单个
<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>
<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>