推荐通过继承 DefaultTask 定义自定义 Task 类型,支持属性配置、输入输出声明和增量构建;需在 buildSrc 中定义并用 @TaskAction、@Input/@OutputFile 注解;注册时用 tasks.register() 并通过 dependsOn/mustRunAfter/finalizedBy 设置执行顺序。

定义自定义 Task 类型(推荐方式)
在 build.gradle 或 build.gradle.kts 中,通过继承 DefaultTask 创建可复用的 Task 类型。这种方式支持属性配置、输入输出声明、增量构建等高级特性。
- 在
buildSrc/src/main/groovy/(Groovy)或buildSrc/src/main/kotlin/(Kotlin)下新建类,例如GenerateVersionFile - 使用
@TaskAction标记执行逻辑方法 - 用
@Input/@OutputFile等注解声明任务输入输出,让 Gradle 自动判断是否跳过执行
示例(Kotlin):
<!-- buildSrc/src/main/kotlin/GenerateVersionFile.kt -->abstract class GenerateVersionFile : DefaultTask() {
@get:Input
abstract val version: Property<String>
<pre class='brush:java;toolbar:false;'>@get:OutputFile
abstract val outputFile: RegularFileProperty
@TaskAction
fun generate() {
outputFile.get().asFile.writeText("VERSION=${version.get()}")
}}
在 build.gradle 中注册并配置该 Task
注册后需明确指定它依赖于哪个生命周期阶段(如 processResources),或插入到某个已存在 Task 的前后。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 使用
tasks.register()注册(推荐,延迟初始化) - 调用
mustRunAfter、shouldRunAfter或dependsOn建立执行顺序 - 若希望它在构建产物生成后运行(如打包后写入版本信息),可让它
finalizedBy某个 Task,或被某个 TaskfinalizedBy
示例(Groovy):
<!-- build.gradle -->tasks.register('generateVersion', GenerateVersionFile) {
version = project.version.toString()
outputFile = layout.buildDirectory.file('generated/version.txt')
// 在 resources 处理完成后执行
mustRunAfter 'processResources'
}
<p>// 让 jar 任务执行完后自动触发该任务
tasks.named('jar') {
finalizedBy 'generateVersion'
}使用 doLast / doFirst 快速添加简单逻辑(适合脚本式任务)
不涉及复用、输入输出或增量构建时,可直接在已有 Task 上追加动作,或创建匿名 Task。
- 用
tasks.create()创建轻量级 Task,配合doLast写执行体 - 通过
dependsOn关联前置条件,如compileJava完成后再执行 - 避免在
doLast中做耗时或副作用操作(如上传、发通知),应封装为独立 Task 并声明输入输出
示例(Groovy):
<!-- build.gradle -->tasks.create('printBuildTime') {
doLast {
logger.lifecycle("Build finished at ${new Date()}")
}
}
// 在 check 生命周期之后运行(check 包含 test、jacoco 等)
tasks.named('check') {
finalizedBy 'printBuildTime'
}理解 Gradle 生命周期与 Task 执行时机
Gradle 构建分三个阶段:初始化 → 配置 → 执行。Task 执行顺序由 DAG(有向无环图)决定,不是按代码顺序。
-
dependsOn表示“我需要它先完成”,形成强依赖 -
mustRunAfter和shouldRunAfter不影响依赖关系,只约束调度顺序(常用于同级并行任务) -
finalizedBy表示“我执行完后,它必须执行”,适合清理、归档、上报等场景 - 常见生命周期 Task:
classes(编译完成)、jar(打包完成)、assemble(所有归档完成)、check(验证完成)
调试执行顺序可用:./gradlew tasks --all 查看全部 Task 及依赖,或 ./gradlew yourTask --dry-run 预览执行流程。

















