首页 文章

从单个Maven项目创建多个可运行的JAR(包含依赖项)[重复]

提问于
浏览
26

这个问题在这里已有答案:

我有一个有多个主要类的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>

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

4 回答

  • 7

    我无法以令人满意的方式用 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>
    
  • 21

    你能行的 . 你'll need a separate execution for each artifact that you'重新构建(即,给每个自己的id,但你可以将阶段保留为默认值),并且你需要为每个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>
    
  • 22

    如果您没有使用捆绑到jar文件中的任何配置(或任何资源)(例如,Spring Framework自动绑定的配置),则The top answer可以正常工作 .

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

    要指定一个对我非常有帮助的前一个答案,你需要添加阶段包和目标程序集并运行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>
    

相关问题