You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:09:54