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

如何在Gradle Kotlin DSL中实现依赖库声明的复用?

解决方案

针对跨项目共享带复杂排除规则的依赖、同时保留Kotlin DSL类型安全的需求,大型项目普遍采用以下两种落地方案:

方案1:使用 buildSrc 共享构建逻辑(优先推荐)

buildSrc 是 Gradle 官方支持的全局构建逻辑共享目录,里面定义的Kotlin类会自动加入所有构建脚本的类路径,不会出现类找不到的问题,同时支持完整的类型检查和IDE补全。

配置步骤

  1. 在仓库根目录新建 buildSrc 文件夹,创建 buildSrc/build.gradle.kts 配置文件:
plugins {
    `kotlin-dsl`
}

repositories {
    mavenCentral()
}
  1. 创建 buildSrc/src/main/kotlin/Libraries.kt 文件,定义所有带排除规则的依赖:
import org.gradle.api.artifacts.dsl.DependencyHandler

class Libraries(dependencies: DependencyHandler) {
    val guava = dependencies.create("com.google.guava:guava:31.1-jre") {
        // 可添加任意数量的exclude规则
        exclude(group = "com.google.guava", module = "listenablefuture")
    }
    // 其余100+依赖按相同格式定义即可
}

// 定义全局扩展属性,无需额外初始化即可调用
val DependencyHandler.libraries get() = Libraries(this)
  1. 所有子项目的 build.gradle.kts 中直接使用即可,无需额外导入或应用脚本:
dependencies {
    implementation(libraries.guava)
}

该方案完美兼容 Gradle 6.9.1 及以上版本,符合你原有 libraries.blah 的使用习惯,同时保留完整的类型安全性。

方案2:基于Extra属性的兼容方案(无需改动目录结构)

如果暂时不想引入buildSrc,可通过弱化类型的方式规避跨脚本类无法导出的问题:

  1. 在 shared/gradle/dependencies.gradle.kts 中定义依赖Map并写入Extra:
val libraries = mapOf(
    "guava" to dependencies.create("com.google.guava:guava:31.1-jre") {
        exclude(group = "com.google.guava", module = "listenablefuture")
    }
    // 其余依赖按格式添加
)
project.extra.set("libraries", libraries)
  1. 在应用了该脚本的项目中直接读取使用:
val libraries: Map<String, Any> by project.extra
dependencies {
    implementation(libraries["guava"] as String)
}

该方案的缺点是丢失了类型安全检查,IDE无法自动补全依赖名称。


内容的提问来源于stack exchange,提问作者Hakanai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:09:01