Java模块指令与Gradle配置依赖映射:export指令对应关系咨询
Java模块指令与Gradle配置的完整映射解析
官方已明确的4种核心映射
先整理你提供的官方映射表(中文翻译版):
| Java模块指令 | Gradle配置 | 用途 |
|---|---|---|
requires | implementation | 声明实现依赖 |
requires transitive | api | 声明API依赖(传递暴露) |
requires static | compileOnly | 声明仅编译依赖 |
requires static transitive | compileOnlyApi | 声明仅编译API依赖(传递暴露) |
你关心的exports指令对应Gradle配置
exports的作用是控制自身模块内包的对外可见性,和api配置完全不是一个维度的概念:
api是依赖管理层面的配置,控制外部依赖是否传递给下游项目exports是模块封装层面的指令,决定自身模块的哪些包能被其他模块访问
在Gradle中,exports并不对应某个依赖配置,而是通过两种方式配置:
- 直接在
module-info.java中编写指令,Gradle会自动识别并处理:module com.example.myapp { // 暴露api包给所有模块 exports com.example.myapp.api; // 仅暴露internal包给指定的consumer模块 exports com.example.myapp.internal to com.example.consumer; } - 通过Gradle的
moduleInfoDSL在构建脚本中配置:java { modularity.inferModulePath = true moduleInfo { exports 'com.example.myapp.api' exports 'com.example.myapp.internal' to 'com.example.consumer' } }
其他Java模块指令的Gradle等效配置
除了上述指令,常见模块指令的处理方式如下:
opens指令:开放包给反射访问,同样支持module-info.java或DSL配置:moduleInfo { opens 'com.example.myapp.reflection' opens 'com.example.myapp.internal' to 'org.junit.jupiter.api' }uses指令:声明服务接口,结合implementation依赖服务接口后,通过module-info.java或DSL配置:moduleInfo { uses 'com.example.myapp.service.MyService' }provides ... with指令:声明服务实现,确保实现类在源码中后,通过module-info.java或DSL配置:moduleInfo { provides 'com.example.myapp.service.MyService' with 'com.example.myapp.service.impl.MyServiceImpl' }
关键误区澄清
你之前混淆了exports和api的作用,核心区别是:
api管依赖传递:让下游项目能间接访问当前项目依赖的模块APIexports管自身暴露:决定当前模块的哪些包可以被外部模块访问
两者没有直接对应关系,分属不同的配置维度。
内容的提问来源于stack exchange,提问作者hsnclk
相关产品推荐
相关产品推荐

