在一个Jar中包含模块的Java项目

时间:2018-09-15 17:08:23

标签: java eclipse maven

我有一个名为BigProject的项目。

结构为:

BigProject
-firstModule
 --pom.xml
-secondModule
 --pom.xml
-thirdModule
 --pom.xml
-pom.xml

我想创建一个名为BigProject.jar的独特jar 目前,如果我进行全新安装,我将为每个模块返回一个jar。

您能解释一下该怎么做吗? 谢谢

3 个答案:

答案 0 :(得分:0)

位于默认软件包中的每个 module-info.java 将被编译为 module-info.class

因此,一个JAR不能包含多个模块

答案 1 :(得分:0)

那么您需要一个自定义的类加载器。值得庆幸的是,人们已经贡献了一些插件来减轻您的生活。您可以查看Ant的create jar任务或spring-boot的重新打包目标,无论您觉得方便如何。下面的示例:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <version>2.0.1.RELEASE</version>
  <executions>
    <execution>
      <goals>
        <goal>repackage</goal>
      </goals>
    </execution>
  </executions>
</plugin>

答案 2 :(得分:0)

如果要创建一个“超级罐”,它是一个包含(合并)来自模块及其依赖项(依赖于它们的jar)的所有类的jar,一种方法是使用Maven Shade插件。

向您的父pom添加另一个模块,例如。 “ uberjar”,并使其依赖于firstModulesecondModulethirdModule。将Shade插件的配置添加到该模块的pom.xml文件中;然后运行mvn package会生成uber jar。

可以像下面的示例一样配置uberjar模块:

<project ...>
  <parent>
    <groupId>myproject</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>

  <artifactId>uberjar</artifactId>

  <dependencies>
    <dependency>
      <groupId>myproject</groupId>
      <artifactId>mod1</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>myproject</groupId>
      <artifactId>mod2</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>myModule.MyMainClass</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>