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

如何从内部包访问Gradle工件子模块中的类?

问题分析与解决方案

核心现象

  • 传递依赖不可访问:和部分资料描述不同,当B依赖A、C依赖B时,C无法访问A的内容,因此已将工件拆分为按外部依赖程度分类的子模块。
  • 子模块访问限制:只有src/main/java根目录下的类能直接访问子模块内容;深层包(如src/main/java/some_package/下的类)导入子模块类时会报符号无法解析错误,而根目录类无需导入即可正常使用。

问题根源

这类异常一般是以下两种情况导致:

  1. JPMS模块导出限制:如果子模块用了Java模块系统(带module-info.java),但没正确导出对应包,会导致带包名的主项目类(属于命名模块)受访问控制限制,而根目录类在未命名模块,不受该规则约束。
  2. 打包配置错误:子模块打包时没保留正确的包结构,导致类文件路径异常,深层包的类找不到对应的子模块类。

解决办法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:33:16