Maven打包带依赖Jar时Manifest配置缺失问题排查
问题原因与解决方法
问题根源
maven-jar-plugin 和 maven-assembly-plugin 是两个独立的 Maven 插件,各自管理自身生成的 JAR 包的 Manifest 配置。你在 maven-jar-plugin 中设置的 Main-Class 和 Multi-Release 只会作用于它生成的普通 JAR,assembly 插件默认不会复用这些配置,所以生成的带依赖胖 JAR 会缺失这些条目。
解决方法
有两种方式可以让 assembly 生成的胖 JAR 带上指定的 Manifest 配置:
方式一:在 assembly 插件中显式配置 Manifest
直接在 maven-assembly-plugin 的配置里添加 <archive> 节点,手动指定主类和 Multi-Release 条目,和你配置 maven-jar-plugin 的方式类似:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.5.1</version> <!-- 使用较新的版本避免潜在问题 --> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- 添加 archive 配置指定 Manifest 信息 --> <archive> <manifest> <mainClass>com.main.App</mainClass> </manifest> <manifestEntries> <Multi-Release>true</Multi-Release> </manifestEntries> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
方式二:复用 maven-jar-plugin 生成的 Manifest 文件
如果不想重复配置,可以让 assembly 插件直接引用 jar 插件已经生成的 Manifest 文件,这个文件默认位于 ${project.build.outputDirectory}/META-INF/MANIFEST.MF:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.5.1</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <!-- 引用 jar 插件生成的 Manifest --> <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
验证
重新执行 mvn clean package,生成的带依赖 JAR 包的 Manifest 就会包含你指定的 Main-Class 和 Multi-Release:true 条目了。
内容的提问来源于stack exchange,提问作者user1941319
相关产品推荐
相关产品推荐

