如何通过for循环为多个cloneId重复执行Gradle的Jar任务?
在Gradle中为多个克隆ID创建Jar任务的解决方案
刚接触Groovy和Gradle的话,遇到多克隆ID的Jar任务需求确实会有点懵,不过别担心,咱们一步步来搞定这个问题~
问题回顾
你已经在gradle.properties里定义了多个克隆ID:
cloneId=clone1,clone2
之前单个ID时Jar任务能正常运行,但现在要给每个ID单独生成对应的Jar包,需要用循环来动态创建任务。
解决方案步骤
1. 解析配置中的克隆ID列表
首先我们需要把gradle.properties里的字符串格式的ID列表转换成Groovy可以遍历的集合。在build.gradle里添加这段代码:
// 从配置中读取克隆ID并处理成干净的列表 def cloneIds = project.property('cloneId').split(',').collect { it.trim() }
这段代码的作用是:
- 用
project.property('cloneId')获取配置里的字符串 split(',')把字符串按逗号拆分成数组collect { it.trim() }去掉每个ID前后的空格(避免输入时不小心加了空格导致任务出错)
2. 动态创建Jar任务
接下来用循环遍历每个克隆ID,为每个ID注册一个独立的Jar任务:
// 为每个克隆ID创建专属的Jar任务 cloneIds.each { id -> tasks.register("jar${id.capitalize()}", Jar) { // 这里沿用你原来的Jar任务配置,只是把cloneId换成当前循环的id def jarTargetDir = file("lib") archiveBaseName = id destinationDir = file("$rootDir/${id}War/lib") // 如果原来的Jar任务有其他配置(比如指定源码输出、包含文件等),直接加在这里就行 // 示例:from sourceSets.main.output } }
这里的关键点:
tasks.register是Gradle推荐的动态创建任务的方式,比旧的task方法更灵活- 任务名用
jar加上首字母大写的ID(比如clone1对应jarClone1),这样能清晰区分每个任务 - 每个任务的配置和你原来的单个Jar任务完全一致,只是把固定的
cloneId换成了循环变量id
3. (可选)创建聚合任务一次性构建所有Jar
如果你想一键构建所有克隆ID的Jar,可以添加一个聚合任务:
// 聚合任务:一键构建所有Jar tasks.register('allJars') { dependsOn cloneIds.collect { "jar${it.capitalize()}" } description 'Builds all JARs for each clone ID' }
执行./gradlew allJars就能一次性触发所有动态创建的Jar任务了。
4. (可选)禁用默认Jar任务(如果不需要)
如果你不需要Gradle默认的jar任务,可以把它禁用,避免冲突:
jar.enabled = false
验证效果
现在你可以执行以下命令测试:
- 构建clone1的Jar:
./gradlew jarClone1 - 构建clone2的Jar:
./gradlew jarClone2 - 构建所有Jar:
./gradlew allJars
每个Jar都会生成到对应的$rootDir/[cloneId]War/lib目录下,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Sandeep Amarnath
相关产品推荐
相关产品推荐

