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

如何获取Gradle复合构建中被包含构建的任务输出

解决Gradle复合构建中复制被包含项目输出的问题

以下是几个可行的解决方向:

1. 利用includedBuild的TaskReference获取输出

TaskReference虽然不是实际任务实例,但可以通过它声明依赖并直接引用输出。示例代码:

tasks.register<Copy>("copyIncludedBuildJars") {
    // 声明对被包含构建中jar任务的依赖,确保其先执行
    dependsOn(gradle.includedBuild("included-build-name").task(":subproject:jar"))
    // 直接引用该任务的输出文件集
    from(gradle.includedBuild("included-build-name").task(":subproject:jar").outputs)
    into("some/dir")
}

核心逻辑:通过dependsOn确保被包含构建的jar任务完成,再通过outputs属性获取实际生成的文件,Gradle会自动解析跨构建的输出路径。

2. 通过依赖配置间接获取输出

如果被包含项目已作为主项目的依赖引入,可利用依赖配置过滤目标jar:

// 主项目build.gradle.kts
dependencies {
    implementation(project(":included-subproject")) {
        artifact {
            type = "jar"
            builtBy(":included-subproject:jar")
        }
    }
}

tasks.register<Copy>("copyDependentJars") {
    from(configurations.runtimeClasspath) {
        // 过滤出目标项目的jar文件
        include("*included-subproject*.jar")
    }
    into("some/dir")
}

适用场景:被包含项目与主项目存在依赖关系时,无需额外处理跨构建任务引用,直接复用依赖配置。

3. 在被包含构建中暴露输出目录

修改被包含项目的构建脚本,通过扩展属性暴露jar输出目录:

// 被包含项目的build.gradle.kts
val jarOutputDir by extra { jar.outputs.files.singleFile.parentFile }

然后在主构建中通过includedBuild的model机制获取该属性:

// 主项目build.gradle.kts
tasks.register<Copy>("copyExposedJars") {
    val includedBuild = gradle.includedBuild("included-build-name")
    // 获取被包含构建暴露的输出目录
    val jarOutputDir = includedBuild.model().get("jarOutputDir").get()
    from(jarOutputDir) {
        include("*.jar")
    }
    into("some/dir")
    // 确保jar任务先执行
    dependsOn(includedBuild.task(":subproject:jar"))
}

优势:可灵活控制输出目录的暴露方式,适合需要自定义输出路径的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:52:15