IntelliJ迁移项目到OpenJDK16遇包冲突及模块找不到问题咨询
Java 16模块系统拆分包及模块依赖问题解决方案
问题1答复
是的,Java平台模块系统(JPMS)明确禁止拆分包行为:同一个全限定包名不能同时存在于两个不同的已命名模块中,这是模块系统的强制校验规则,你的两个模块都定义了com.company.feature包,必然触发该报错,和IDE配置无关,属于Java规范层面的限制。
问题2答复
错误2和错误1直接相关。编译器在模块解析阶段会优先校验包归属合法性,检测到拆分包冲突后会直接终止后续的依赖解析流程,因此即使你填写了正确的模块名,也会收到「Module not found」的提示,先解决拆分包问题,错误2会自动消失。
非全量unnamed module场景下的修复方案
以下方案均不需要把所有模块降级为unnamed module,可根据你的遗留代码改造成本选择:
方案1:使用--patch-module参数合并拆分包(改造成本最低)
该参数可以将一个模块的包内容合并到另一个模块的同名包中,绕过拆分包校验,完全适配你现有目录结构:
- 编译home模块时添加JVM参数:
--patch-module com.company.feature.apimodule=/path/to/home/src/com/company/feature
- IntelliJ IDEA配置路径:
File -> Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler,在「Additional command line parameters」栏填入上述参数即可。 - 应用启动时也需要添加相同的
--patch-module参数,避免运行时校验失败。
方案2:调整包结构(符合JPMS规范,无后续维护成本)
如果改造成本可接受,直接调整其中一个模块的包名即可,比如将home模块的包改为com.company.feature.home,同步修改module-info.java的配置即可完全适配模块系统规则。
方案3:公共包统一收敛到API模块
如果api模块的定位就是公共接口定义层,直接把com.company.feature包下的所有内容都收敛到api模块中,home模块只存放独有的业务代码,不再创建同名的com.company.feature包即可。
内容的提问来源于stack exchange,提问作者AlexHomeBrew
相关产品推荐
相关产品推荐

