maven-assembly-plugin高版本打fatjar未包含项目自身类文件问题
maven-assembly-plugin高版本fatjar缺失自身编译类解决方案
问题表现
- 使用3.2.0、3.4.0、2.2等正式版本maven-assembly-plugin打包fatjar时,
target/classes目录下的项目自身编译构件未被打入jar包,仅META-INF/MANIFEST.MF、第三方依赖包内容正常存在 - 执行类检索命令无任何输出:
jar -tvf target/my-fat-jar.jar | grep Main.class
- 仅2009年发布的2.2-beta-5版本可正常生成包含自身类的fatjar,无法满足使用新版本插件的需求
问题根因
高版本maven-assembly-plugin默认不会在直接执行assembly:single命令时自动引入当前项目的编译输出,仅当插件目标绑定到Maven标准生命周期的对应阶段时,才会按jar-with-dependencies描述符规则将当前项目构建产物、第三方依赖共同打入fatjar。原有配置仅定义了插件参数,未配置执行绑定,是导致类缺失的核心原因。
修复方案
调整插件配置,新增executions块将single打包目标绑定到package阶段,完整配置如下:
<plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.4.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>my_package.Main</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- 不需要jar包名携带jar-with-dependencies后缀时可开启以下配置 --> <!-- <appendAssemblyId>false</appendAssemblyId> --> </configuration> <executions> <execution> <id>build-fat-jar</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
配置完成后执行标准Maven打包命令即可,不要直接调用assembly:single目标:
mvn clean package
该配置已在3.2.0、3.4.0版本验证通过,生成的fatjar可正常包含自身编译生成的所有类文件。
异常排查
如果配置后仍存在类缺失问题,逐一检查以下配置:
- 确认编译阶段正常执行,
target/classes目录下存在对应编译生成的class文件,无编译跳过、编译失败的情况 - 若使用自定义assembly描述符,检查描述符内未配置排除当前项目构建输出的规则
- 检查pom内无全局配置将当前项目构建产物的依赖范围设置为
provided导致被插件排除
内容的提问来源于stack exchange,提问作者João Paraná
相关产品推荐
相关产品推荐

