1. 概述
本文将介绍如何在Gradle中创建自定义任务。我们将通过构建脚本或自定义任务类型两种方式展示任务定义方法。
关于Gradle的基础知识,建议先阅读这篇文章,其中包含Gradle核心概念及本文所需的任务基础知识。
2. 在build.gradle中定义自定义任务
要创建一个简单的Gradle任务,只需在build.gradle文件中添加定义:
task welcome {
doLast {
println 'Welcome in the Baeldung!'
}
}
这个任务的核心功能是打印"Welcome in the Baeldung!"。通过执行以下命令可验证任务是否可用:
gradle tasks --all
任务会出现在Other tasks分组下:
Other tasks
-----------
welcome
执行方式与普通Gradle任务一致:
gradle welcome
输出结果完全符合预期——"Welcome in the Baeldung!"消息。
⚠️ 注意:若未指定--all
选项,"Other"分组的任务将不可见。自定义任务可归属于其他分组,并添加描述信息。
3. 设置分组和描述
按功能对任务分组能提升管理效率。通过定义group属性即可为任务指定分组:
task welcome {
group 'Sample category'
doLast {
println 'Welcome on the Baeldung!'
}
}
执行gradle tasks
(无需--all
)后,任务将显示在新分组下:
Sample category tasks
---------------------
welcome
为让他人理解任务用途,添加描述信息至关重要:
task welcome {
group 'Sample category'
description 'Tasks which shows a welcome message'
doLast {
println 'Welcome in the Baeldung!'
}
}
任务列表输出将变为:
Sample category tasks
---------------------
welcome - Tasks which shows a welcome message
这种定义方式称为临时任务定义(ad-hoc definition)。
接下来我们将创建可复用的可定制任务,通过任务类型实现用户自定义功能。
4. 在build.gradle中定义Gradle任务类型
前文的"welcome"任务无法定制,实用性有限。若要在其他项目(或子项目)复用,需复制粘贴定义代码。
我们可以通过创建任务类型实现定制化。任务类型本质是构建脚本中的Groovy类:
class PrintToolVersionTask extends DefaultTask {
String tool
@TaskAction
void printToolVersion() {
switch (tool) {
case 'java':
println System.getProperty("java.version")
break
case 'groovy':
println GroovySystem.version
break
default:
throw new IllegalArgumentException("Unknown tool")
}
}
}
✅ 自定义任务类型关键点:
- 继承
DefaultTask
(标准任务实现基类) - 可扩展其他任务类型,但
DefaultTask
最常用 - 通过属性实现定制化:
String tool
可按需添加任意数量属性——这只是Groovy类的普通字段。
@TaskAction
注解方法定义任务核心逻辑:- 示例中根据参数打印Java/Groovy版本
要执行基于此类型的任务,需创建任务实例:
task printJavaVersion(type : PrintToolVersionTask) {
tool 'java'
}
核心要素说明:
- 任务类型为
PrintToolVersionTask
,执行时触发@TaskAction
方法 - 定制
tool
属性值为java
执行结果(取决于Java版本):
> Task :printJavaVersion
9.0.1
创建打印Groovy版本的任务:
task printGroovyVersion(type : PrintToolVersionTask) {
tool 'groovy'
}
复用相同任务类型但修改tool
属性,执行后输出:
> Task :printGroovyVersion
2.4.12
⚠️ 维护建议:少量任务可直接在build.gradle中定义,但数量过多会导致文件臃肿难读。Gradle提供了更优雅的解决方案。
5. 在buildSrc文件夹中定义任务类型
在项目根目录的buildSrc文件夹中定义任务类型是更优方案。Gradle会自动编译该目录内容并添加到类路径,供构建脚本使用。
前文定义的PrintToolVersionTask
可迁移至:
buildSrc/src/main/groovy/com/baeldung/PrintToolVersionTask.groovy
❌ 迁移时需注意:
- 添加Gradle API相关导入语句
- 保持类名和逻辑不变
build文件夹方案的优势:
- 无限定义任务类型
- 提升可维护性与可读性
- 分离任务类型声明与实例化
使用方式与直接定义在构建脚本中的类型完全一致,只需记得添加正确导入。
6. 在插件中定义任务类型
自定义Gradle插件是任务类型的理想容器。参考插件创建指南,插件可定义在:
- build.gradle文件
- buildSrc目录中的Groovy类
当构建脚本声明对该插件的依赖时,其中的自定义任务类型即可使用。注意:临时任务同样可用,不仅限于自定义任务类型。
7. 总结
本文全面介绍了Gradle自定义任务的创建方法。实际开发中可充分利用现有插件提供的丰富任务类型,减少重复开发。
所有代码示例可在GitHub仓库中获取。