如何在Gradle复合构建的根构建中获取引入构建的任务属性
Gradle复合构建读取引入构建任务属性方案
可行性说明
这种操作完全可行,你之前写法返回null的核心原因是:复合构建默认会按需配置引入构建(included build),你在根构建配置阶段直接读取任务属性时,目标引入构建的配置阶段还未执行,任务属性尚未完成初始化。
解决方案
方案1:执行阶段读取(推荐,不影响配置性能)
将属性读取逻辑放在任务的执行阶段,同时声明对目标引入构建任务的依赖,确保执行读取逻辑前目标任务已经完成配置:
// 根构建build.gradle 示例代码 tasks.register('readIncludedBuildArtifactPath') { // 声明依赖,确保执行前includedBuild1的目标任务已完成配置 dependsOn gradle.includedBuild('includedBuild1').task(':project1:shadowJar') doLast { // 执行阶段读取属性,此时属性已完成初始化 def targetArchive = gradle.includedBuild('includedBuild1').task(':project1:shadowJar').archiveFile.get() println "目标构件路径:${targetArchive.asFile.absolutePath}" } }
执行./gradlew readIncludedBuildArtifactPath即可拿到对应属性值。
方案2:配置阶段强制触发引入构建配置
如果确实需要在根构建的配置阶段拿到属性,可以主动触发所有引入构建完成配置,注意该操作会延长整体配置时间,非必要不推荐:
// 根构建build.gradle 示例代码 // 强制所有引入构建完成配置 gradle.includedBuilds.each { it.ensureConfigured() } // 直接读取目标任务属性 def targetArchive = gradle.includedBuild('includedBuild1').task(':project1:shadowJar').archiveFile.get() println "配置阶段读取到的目标构件路径:${targetArchive.asFile.absolutePath}"
补充注意点
你之前在includedBuild1根构建中引用shadowJar任务失败、以及示例代码中用了:project1:jar任务,是因为shadowJar是project1项目单独应用插件后生成的任务,仅存在于project1的任务容器中:
- 若你需要读取的是Shadow插件生成的构件,不要使用普通
jar任务,直接指定任务路径为:project1:shadowJar即可。
内容的提问来源于stack exchange,提问作者Paul Galbraith
相关产品推荐
相关产品推荐

