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

如何在Gradle Kotlin DSL中向配置添加构件?Groovy迁移报错求助

解决Gradle Kotlin DSL中testJar配置的Unresolved reference问题

问题根源

Groovy DSL是动态类型,允许直接在artifacts块中用配置名作为方法名,但Kotlin DSL是静态类型,不支持这种隐式引用;同时tasks.register()返回的是延迟初始化的TaskProvider,需要显式获取任务实例才能关联到配置。

正确写法

有两种等价实现方式,任选其一即可:

方式1:通过配置名字符串引用

val testJar = tasks.register<Jar>("testJar") {
    archiveClassifier.set("tests")
    from(sourceSets["test"].output)
    from(sourceSets["test"].allSource)
}

configurations {
    create("tests")
}

artifacts {
    // 使用add方法关联配置与工件,调用get()获取TaskProvider的实际实例
    add("tests", testJar.get())
}

方式2:保存配置引用为变量

val testJar = tasks.register<Jar>("testJar") {
    archiveClassifier.set("tests")
    from(sourceSets["test"].output)
    from(sourceSets["test"].allSource)
}

// 将创建的配置存储为变量,后续直接引用
val testsConfig = configurations.create("tests")

artifacts {
    add(testsConfig, testJar.get())
}

关键说明

  1. 静态类型约束:Kotlin DSL不支持Groovy那样的隐式配置调用,必须通过artifacts.add()方法显式关联配置和工件。
  2. TaskProvider的get()方法:tasks.register()返回的是TaskProvider<Jar>而非直接的Jar任务对象,调用get()才能获取实际任务实例(Gradle会自动处理任务依赖的延迟初始化逻辑)。

其他子项目依赖该testJar的写法

在需要引用testJar的子项目中,通过指定配置名称引入:

dependencies {
    testImplementation(project(":你的子项目名称", "tests"))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:39:50