如何在Gradle java-library插件中使用apiElements和runtimeElements configurations?
如何在Gradle java-library插件中使用apiElements和runtimeElements configurations?
嘿,我来给你掰扯清楚怎么在Gradle的java-library插件里用好apiElements和runtimeElements这两个配置项~
Gradle的java-library插件提供了一系列专门的配置项来帮你管理依赖的可见性和传递性,其中apiElements和runtimeElements是给依赖你的库的“消费者”用的核心配置,下面分别给你讲怎么用:
一、apiElements配置
- 它是消费者编译时依赖的核心配置,会暴露你的库中需要让消费者在编译阶段就能访问到的所有内容,包括:
- 你的库编译后的类文件
- 你通过
api关键字声明的所有传递性依赖
- 举个实际的配置例子,在你的构建脚本里可以这样写:
// Groovy DSL dependencies { api 'com.google.guava:guava:32.1.3-jre' }
// Kotlin DSL dependencies { api("com.google.guava:guava:32.1.3-jre") }
当其他项目依赖你的库时,它们在编译自己的代码时就能直接使用Guava的类,不需要再单独引入这个依赖——因为apiElements已经把Guava暴露出去了。
二、runtimeElements配置
- 它是消费者运行时依赖的核心配置,包含你的库运行时需要的所有内容,包括:
- 你的库编译后的类文件
- 你通过
implementation、runtimeOnly声明的传递性依赖 - 即使是
api声明的依赖,也会被包含在runtimeElements里,保证运行时的完整性
- 举个例子,如果你这样声明依赖:
// Groovy DSL dependencies { implementation 'org.apache.commons:commons-lang3:3.14.0' }
// Kotlin DSL dependencies { implementation("org.apache.commons:commons-lang3:3.14.0") }
这个Commons Lang3依赖只会出现在runtimeElements中,消费你的库的项目在编译自己的代码时看不到这个依赖,但运行项目时,Gradle会自动把这个依赖加入到类路径中,保证程序能正常跑起来。
简单总结一下
- 如果你希望某个依赖能被消费你的库的项目在编译时访问,就用
api声明,它会进入apiElements配置 - 如果你只希望依赖在自己的库编译时可用,且只在消费方运行时被引入,就用
implementation声明,它会进入runtimeElements配置
内容来源于stack exchange
相关产品推荐
相关产品推荐

