使用Maven 3.9.3构建JPMS模块时出现Package缺失报错求助
JPMS模块在Maven 3.9.3构建失败的原因分析
环境信息
- Maven 3.8.5版本详情:
Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0) Maven home: /opt/netbeans-14/java/maven Java version: 21.0.1, vendor: Oracle Corporation, runtime: /opt/jdk-21.0.1
- Maven 3.9.3版本详情:
Apache Maven 3.9.3 (21122926829f1ead511c958d89bd2f672198ae9f) Maven home: /opt/netbeans-19/java/maven Java version: 21.0.1, vendor: Oracle Corporation, runtime: /opt/jdk-21.0.1
问题现象
使用Maven 3.8.5执行clean install构建JPMS模块时无异常,但切换到Maven 3.9.3执行相同命令,出现如下构建失败报错:
[INFO] --- jar:3.3.0:jar (default-jar) @ mymodule-impl --- [INFO] Building jar: /home/pavel/mymodule-impl/target/mymodule-impl-1.0.0.jar jar: Package a.b.c missing from ModulePackages class file attribute [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ Total time: 3.386 s Finished at: 2023-11-03T20:34:05+02:00 ------------------------------------------------------------------------ Failed to execute goal org.apache.maven.plugins:maven-jar-plugin:3.3.0:jar (default-jar) on project mymodule-impl: Error assembling JAR: Could not create modular JAR file. The JDK jar tool exited with 1 -> [Help 1]
报错原因
核心原因是JPMS模块的module-info.class中声明了包a.b.c,但最终生成的JAR里没有该包对应的类文件或资源。
Maven 3.9.x系列对JPMS模块的校验逻辑更严格:
- Maven 3.8.5搭配的maven-jar-plugin版本较低,对JPMS模块的包声明校验不严格,即使
module-info里声明的包实际不存在,也能完成构建; - Maven 3.9.3使用的maven-jar-plugin 3.3.0会调用JDK的
jar工具执行严格校验,一旦发现module-info中声明的包在JAR中不存在,就会触发该错误。
是否属于Bug?
这不属于Bug,而是Maven生态对JPMS规范的严格落地。JPMS本身要求module-info中声明的所有包必须在模块内存在,Maven 3.9.x及对应插件版本只是强化了这一规范的校验,避免生成不符合JPMS标准的模块化JAR。
解决方案
- 检查
module-info.java,移除那些声明了但实际不存在的包(比如a.b.c); - 如果
a.b.c包是模块必需的,确认该包下的类文件是否被正确编译,且是否被maven-compiler-plugin正确处理并打包到JAR中; - 若需临时绕过校验(不推荐,会生成不规范模块JAR),可尝试升级maven-jar-plugin至3.4.0及以上版本,或在插件配置中关闭JPMS严格校验。
内容的提问来源于stack exchange,提问作者user5182503
相关产品推荐
相关产品推荐

