从单个Maven项目创建多个可运行的Jars(包含依赖项)

Mar*_*rau 27 java executable-jar maven maven-assembly-plugin

我有一个有多个主要类的maven项目.我想从这些项目中生成可运行的Jars(包括所有依赖项).我目前有以下构建配置(使用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>
Run Code Online (Sandbox Code Playgroud)

他们是用maven-assembly来实现这个目标的吗?如果没有,实现目标的最简单方法是什么?

Don*_*ows 24

你能行的.你需要为你建立(即给每个自己的ID,但你可以离开的阶段为默认值)的每个工件单独的执行,你就需要指定finalName和存档/清单/ 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>
Run Code Online (Sandbox Code Playgroud)

  • 从尝试这个解决方案和[发布在这里](http://stackoverflow.com/a/15799254/288875),它看起来像还需要添加`<goals>`和`<phase>`标签? (4认同)
  • 它也可能应该明确地声明要使用"单一"目标. (3认同)

Mar*_*rau 23

我无法以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>
Run Code Online (Sandbox Code Playgroud)


Dex*_*spi 10

如果您没有使用捆绑到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>
Run Code Online (Sandbox Code Playgroud)


小智 5

要指定对我非常有帮助的先前答案,您需要添加阶段包和目标程序集并运行 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>
Run Code Online (Sandbox Code Playgroud)

  • 目标“汇编”已弃用。请参阅[插件信息](https://maven.apache.org/plugins/maven- assembly-plugin/plugin-info.html)。最好使用“single”代替。 (2认同)