Java 9模块化exports失效编译错误求助
解决Java 9模块化中exports失效的编译错误
结合你的模块依赖关系和编译报错,我来一步步帮你定位并解决问题:
1. 核心问题拆解
你遇到的package com.red30tech.cache does not exist错误,本质是模块间的访问权限没有通过module-info.java正确声明,而且这里还有个潜在矛盾:你描述的依赖关系是com.red30tech.cache依赖com.red30tech.backend,但backend模块的代码却在引用cache的包,这会触发Java模块化禁止的循环依赖,这大概率是问题的关键。
2. 逐个修正模块的module-info.java
首先确保每个模块的module-info.java都放在模块根目录下(比如src/com.red30tech.cache/module-info.java),然后分两种场景调整:
场景A:依赖关系描述正确(backend不应引用cache)
如果是backend的代码误引用了cache的包,先移除Processor.java中对com.red30tech.cache的引用,再修正三个模块的声明:
- com.red30tech.backend:导出自身包给cache模块使用
module com.red30tech.backend { exports com.red30tech.backend; // 允许cache模块访问backend的代码 } - com.red30tech.cache:声明依赖backend,并导出自身包给database使用
module com.red30tech.cache { requires com.red30tech.backend; exports com.red30tech.cache; // 允许database模块访问cache的代码 } - com.red30tech.database:声明依赖另外两个模块
module com.red30tech.database { requires com.red30tech.cache; requires com.red30tech.backend; }
场景B:backend确实需要引用cache的包(调整依赖关系)
如果业务逻辑上backend必须访问cache,那需要修正依赖关系为backend依赖cache(避免循环依赖),再调整声明:
- com.red30tech.cache:导出自身包
module com.red30tech.cache { exports com.red30tech.cache; } - com.red30tech.backend:声明依赖cache,并导出自身包
module com.red30tech.backend { requires com.red30tech.cache; exports com.red30tech.backend; } - com.red30tech.database:保持依赖两个模块的声明不变
3. 重新编译验证
修正完成后,重新执行你的编译命令:
javac -d mods/ --module-source-path src $(find src -name "*.java")
关键注意事项
- exports的生效条件:模块A导出的包,只有显式声明
requires A的模块才能访问,没有声明依赖的模块无法访问; - 禁止循环依赖:Java模块化严格禁止模块间双向依赖(A依赖B,B又依赖A),如果必须双向访问,建议把公共代码提取到新模块,让两个模块都依赖这个新模块;
- 规范目录结构:确保每个模块的源码都放在
src/模块名/下,module-info.java在模块根目录,包结构与模块名对应。
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

