如何将模块jar合并到Maven2中的单个jar?

时间:2009-12-13 04:24:16

标签: maven-2

我有一个带有几个jar模块的maven2项目,构建项目将获得目录modules / XYZ / target / XYZ-x.x.x.jar中每个模块的.jar存档

现在,如果我的项目P是版本P-p.q.r,并且我想生成包含所有子模块的单个jar P-p.q.r-all.jar,我该怎么办?

2 个答案:

答案 0 :(得分:19)

您希望获得的内容称为 uber jar 。此模块必须具有要包装到一个jar中的所有其他子模块的依赖性。如果您创建另一个将生成所需工件的子模块,则可以在reactor中构建其所有依赖项,但如果它是一个单独的项目,则必须安装所有uber jar依赖项。

| parent
| -- submodule1
...
| -- submoduleN
| -- uberjarSubmodule

Uber jar可以使用:

完成
  1. maven-shade-plugin - 在您的情况下,您必须记住从模块中排除传递依赖

    <project>
    ...
    <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.2.2</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <artifactSet>
                <excludes>
                  <exclude>classworlds:classworlds</exclude>
                  <exclude>junit:junit</exclude>
                  <exclude>jmock:jmock</exclude>
                  <exclude>xml-apis:xml-apis</exclude>
                </excludes>
              </artifactSet>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
    </build>
    ...
    </project>
    
  2. maven-assembly-plugin - 在this问题中,您会找到详细的答案

答案 1 :(得分:1)

如果您的jar是您希望其他开发人员通过maven下载和使用的库,则取决于您将如何发送此文件。您应该在项目pom中将这些指定为dependencies

如果您尝试将某些内容发送给只想抓取二进制文件并使用您的项目的最终用户,您可以尝试使用assembly插件打包您的项目。使用此插件,您可以将jar包装在其依赖项旁边。它不会将所有内容都放在一个jar文件中,但假设您正确配置了用户类路径,则无关紧要。