【问题标题】:Create multiple runnable Jars (with dependencies included) from a single Maven project [duplicate]从单个 Maven 项目创建多个可运行的 Jar(包括依赖项)[重复]
【发布时间】:2012-02-02 08:31:56
【问题描述】:

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

<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-assembly 实现这一目标的方法吗?如果没有,实现我的目标的最简单方法是什么?

【问题讨论】:

  • 您是否尝试使用不同的配置为maven-assembly-plugin 创建多个&lt;plugin&gt; 条目?这将触发此插件两次,并希望创建两个 JAR 文件...
  • @dma_k 按照您的建议,尝试生成三个 JAR,前两个被最后一个 &lt;plugin&gt; 配置覆盖。
  • 尝试使用&lt;finalName&gt;配置选项(检查here)。

标签: java maven executable-jar maven-assembly-plugin


【解决方案1】:

你可以做到。您需要为正在构建的每个工件单独执行(即,为每个工件提供自己的 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>

【讨论】:

  • 它可能还应该明确声明要使用single 目标。
  • 从尝试这个解决方案和posted here,看起来还需要添加&lt;goals&gt;&lt;phase&gt; 标签?
  • 我编辑了帖子(等待同行评审)以包含目标和阶段标签。
  • 是否也可以同时安装它们?通过为工件添加后缀?
  • 这两个罐子也可以用 shade 插件最小化吗?
【解决方案2】:

我无法通过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>

【讨论】:

  • 两个executions中的两个ids不应该不同吗?如果我不止一次拥有相同的 id,我的 maven 会抱怨。
  • @AndreHolzner:是的,这是一个错误
  • 恕我直言,maven-assembly-plugin 也可以做到这一点。见@donal-fellows 回答
  • 需要不同的 id 来唯一标识单独的 jar,
  • 你应该用这个替换插件库:redhat-earlyaccess-repositorymaven.repository.redhat.com/earlyaccess/all/</url>
【解决方案3】:

The top answer 有效如果您没有使用捆绑到您的 jar 文件中的任何配置(或任何资源)(例如,Spring Framework 自动绑定的配置)。

幸运的是,此解决方案也适用于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>

【讨论】:

    【解决方案4】:

    要指定对我非常有帮助的更多先前答案, 您需要添加阶段包和目标程序集并运行 mvn run clean package,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>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多