如何避免Gradle中「添加配置作为依赖」的弃用警告?
问题背景
我有两个Gradle项目,gen子项目作为生成代码的生产者,配置如下:
// gen/build.gradle.kts ... val outDir = layout.projectDirectory.dir("output") val run = tasks.named<JavaExec>("run") { args = listOf(outDir.asFile.absolutePath) } configurations.create("generated") { isCanBeResolved = false isCanBeConsumed = true } artifacts { add("generated", outDir) { builtBy(run) } }
根项目作为消费者,原本的配置如下:
// build.gradle.kts ... val generated by configurations.creating<Configuration> { isCanBeResolved = true isCanBeConsumed = false } dependencies { generated(project(mapOf( "path" to ":gen", "configuration" to "generated", ))) api(generated) } sourceSets { main { kotlin { srcDir(generated.files) } } }
当前通过dependencies声明:generated配置依赖于:gen:generated配置,但触发了Gradle弃用警告:
Adding a Configuration as a dependency is a confusing behavior which isn't recommended. This behaviour has been deprecated and is scheduled to be removed in Gradle 8.0. If you're interested in inheriting the dependencies from the Configuration you are adding, you should use Configuration#extendsFrom instead. See https://docs.gradle.org/7.4.2/dsl/org.gradle.api.artifacts.Configuration.html#org.gradle.api.artifacts.Configuration:extendsFrom(org.gradle.api.artifacts.Configuration[]) for more details.
尝试改用extendsFrom直接继承跨项目配置,报错:
Configuration with name 'generated' not found.
改用afterEvaluate延迟执行继承逻辑,又报错:
A problem occurred configuring project ':gen'.
Cannot change dependencies of dependency configuration ':generated' after it has been resolved.
解决方案
方法一:调整配置与依赖的关联方式
核心是不要将整个generated配置作为api的依赖,拆分逻辑:保留对:gen:generated的依赖声明,通过extendsFrom处理依赖传递,单独将生成文件加入源码集。
修改根项目的build.gradle.kts:
// build.gradle.kts ... val generated by configurations.creating<Configuration> { isCanBeResolved = true isCanBeConsumed = false } dependencies { // 保留对:gen:generated的依赖声明 generated(project(mapOf( "path" to ":gen", "configuration" to "generated", ))) // 让api配置继承generated的依赖(按需添加,不需要可省略) configurations.api.get().extendsFrom(generated) } sourceSets { main { kotlin { srcDir(generated.files) } } }
方法二:使用延迟配置引用简化写法
通过named获取:gen项目generated配置的延迟引用,避免配置顺序问题,同时不触发弃用警告:
// build.gradle.kts ... // 获取:gen项目generated配置的延迟引用 val genGenerated = project(":gen").configurations.named("generated") dependencies { // 让api继承:gen:generated的依赖(按需添加) configurations.api.get().extendsFrom(genGenerated.get()) } sourceSets { main { kotlin { // 延迟获取配置文件,避免解析时机问题 srcDir(genGenerated.map { it.files }) } } }
为什么之前的方法失效
- 直接跨项目调用
extendsFrom时,:gen项目的配置尚未完成,导致找不到目标配置 - 使用
afterEvaluate延迟执行时,generated配置可能已经被源码集初始化过程解析,此时无法修改其依赖继承关系
内容的提问来源于stack exchange,提问作者Will Burden

