我开发了一个功能齐全的简单 Maven 多模块项目。该项目的目标是将两个 jar(来自模块
a
和模块 b
)打包到一个包含两个应用程序的功能齐全的 jar 中。该项目可以通过 MainA 或 MainB 启动。这是该项目:
Maven 多模块项目
虽然项目在 IDE 中顺利运行(运行
MainA
、MainB
或最终的 jar),但在尝试在项目目录外执行最终的 .jar 时遇到问题。在根项目文件夹中运行 mvn clean install
后,最终的 jar(可能称为 uber jar,但不确定)会在 a
模块的目标文件夹中生成,名称为 a-1.0-SNAPSHOT.jar
。但是,当我尝试在 IDE 之外运行这个 jar (java -jar a-1.0-SNAPSHOT.jar
) 时,执行失败。
我怀疑尽管使用了 maven-assemble-plugin,但最终的 jar 中并未正确包含依赖项。我已检查了我的配置,但无法确定此问题的原因。
任何有关解决此问题的见解或建议将不胜感激。
如果我没理解错的话,你有两个模块
a
和b
,并且你想将module-b
打包成module-a
作为可以直接运行的单个jar。
正如您提到的
maven-assembly-plugin
功能齐全,请尝试将其添加到您的 module-a
pom.xml 文件中。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<!-- Set jar file name -->
<finalName>${project.artifactId}-${project.version}-all</finalName>
<!-- disabled default file name suffix of "jar-with-dependencies" -->
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<!-- Add all dependency to jar file -->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<attach>false</attach>
<archive>
<manifest>
<!-- replace to your main class name -->
<mainClass>fully.qualified.MainClass</mainClass>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<!-- Set effect phase -->
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
完成
clean install
后,target
目录会生成xxx-all.jar
文件,现在就可以使用java -jar xxx-all.jar
运行了。