如何通过CLI获取Gradle多项目构建生成的所有二进制文件/包?
无需修改项目的Gradle制品收集方案
针对你的大规模多版本Gradle项目场景,这里提供几种无需修改项目代码的方法,让Gradle直接报告需发布的二进制文件及存储位置:
方法1:提取项目发布核心属性
利用Gradle内置的properties命令,跳过构建直接读取项目配置,快速获取制品的基础信息和输出目录:
gradle properties --no-build -q | grep -E "(archivesBaseName|version|group|libsDirectory|distributionsDirectory)"
--no-build:避免执行构建流程,节省大量时间-q:仅输出关键属性,过滤冗余日志- 关键属性说明:
archivesBaseName/version/group:组成制品的标准命名libsDirectory:Jar/War等库文件的默认输出目录distributionsDirectory:Zip/Tar等分发包的输出目录
方法2:通过任务模拟执行获取输出信息
针对发布类任务(如uploadArchives、publish),用模拟执行模式获取其关联的输出文件路径:
# 查看所有子项目的发布任务输出 gradle publish -m -q | grep "Output files" # 指定单个子项目 gradle :sub-project:publish -m -q | grep "Output files"
-m:仅模拟任务执行,不实际发布,仅输出任务的输入输出元数据
方法3:用初始化脚本生成统一制品报告
编写轻量初始化脚本,遍历所有子项目收集制品信息,无需修改项目的build.gradle:
创建临时脚本artifact-report.gradle:
allprojects { afterEvaluate { proj -> def artifacts = [] // 收集Jar/War类制品 proj.tasks.withType(Jar).each { task -> artifacts.add([ projectPath: proj.path, artifactType: task.name, absolutePath: task.outputs.files.singleFile.absolutePath, fileName: task.outputs.files.singleFile.name ]) } // 收集分发包制品 proj.tasks.withType(Distribution).each { task -> task.outputs.files.each { file -> artifacts.add([ projectPath: proj.path, artifactType: task.name, absolutePath: file.absolutePath, fileName: file.name ]) } } // 输出JSON格式结果,方便Jenkins解析 if (!artifacts.isEmpty()) { println new groovy.json.JsonBuilder(artifacts).toPrettyString() } } }
在Jenkins中执行:
gradle --init-script artifact-report.gradle tasks --no-build -q
--init-script:在项目脚本前执行,完全不侵入现有项目代码
方法4:老版本Gradle兼容方案
针对Gradle 4.x及更早版本,结合依赖命令和文件扫描补充:
# 获取归档配置中的制品名称 gradle dependencies --configuration archives -q | grep -E ".*:.jar" | awk '{print $1}' # 扫描构建目录下的所有可发布制品 find $(gradle properties -q | grep buildDir | awk -F= '{print $2}') -name "*.jar" -o -name "*.zip" -o -name "*.war"
核心优势
- 完全无需修改项目代码,适配所有Gradle版本和多项目架构
- 命令行/脚本化方式可直接集成到现有Jenkins流水线
- 支持批量处理5000+仓库,通过Jenkins批量执行并解析输出
内容的提问来源于stack exchange,提问作者Peter Kahn
相关产品推荐
相关产品推荐

