如何从内部包访问Gradle工件子模块中的类?
问题分析与解决方案
核心现象
- 传递依赖不可访问:和部分资料描述不同,当B依赖A、C依赖B时,C无法访问A的内容,因此已将工件拆分为按外部依赖程度分类的子模块。
- 子模块访问限制:只有
src/main/java根目录下的类能直接访问子模块内容;深层包(如src/main/java/some_package/下的类)导入子模块类时会报符号无法解析错误,而根目录类无需导入即可正常使用。
问题根源
这类异常一般是以下两种情况导致:
- JPMS模块导出限制:如果子模块用了Java模块系统(带
module-info.java),但没正确导出对应包,会导致带包名的主项目类(属于命名模块)受访问控制限制,而根目录类在未命名模块,不受该规则约束。 - 打包配置错误:子模块打包时没保留正确的包结构,导致类文件路径异常,深层包的类找不到对应的子模块类。
解决办法
1. 修正JPMS模块配置(若使用)
如果子模块用了Java模块系统,必须在module-info.java中导出对应包:
// 子模块的module-info.java module io.github.org.anartifact_submodule { exports io.github.org.anartifact_submodule; }
同时在主项目的module-info.java中声明依赖:
// 主项目的module-info.java module your.main.module { requires io.github.org.anartifact_submodule; }
2. 调整子模块打包配置(非JPMS场景)
检查子模块的Gradle配置,确保打包时保留完整包结构:
- 确认子模块类打包后路径为
io/github/org/anartifact_submodule/,而非根目录平级文件。 - 确保
jar任务没有修改类输出路径:
// 子模块build.gradle jar { from sourceSets.main.output }
3. 修正导入语句并清理缓存
深层包的类必须使用子模块类的完整包路径导入:
// src/main/java/some_package/DeepClass.java package some_package; import io.github.org.anartifact_submodule.SomeClass; public class DeepClass { SomeClass sc = new SomeClass(); }
执行清理构建命令,清除缓存:
./gradlew clean build
补充:传递依赖不可访问的解决
如果用Gradle的implementation依赖,默认不会暴露传递依赖到上层项目。要让C能访问B的依赖A,需在B的构建脚本中将A声明为api依赖:
// B模块build.gradle dependencies { api 'io.github.org:artifact-a:1.0.0' }
内容的提问来源于stack exchange,提问作者Delark
相关产品推荐
相关产品推荐

