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")
        }
    }
}

自定义任务类型关键点

  1. 继承DefaultTask(标准任务实现基类)
  2. 可扩展其他任务类型,但DefaultTask最常用
  3. 通过属性实现定制化:
String tool

可按需添加任意数量属性——这只是Groovy类的普通字段。

  1. @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文件夹方案的优势

  1. 无限定义任务类型
  2. 提升可维护性与可读性
  3. 分离任务类型声明与实例化

使用方式与直接定义在构建脚本中的类型完全一致,只需记得添加正确导入。

6. 在插件中定义任务类型

自定义Gradle插件是任务类型的理想容器。参考插件创建指南,插件可定义在:

  • build.gradle文件
  • buildSrc目录中的Groovy类

当构建脚本声明对该插件的依赖时,其中的自定义任务类型即可使用。注意:临时任务同样可用,不仅限于自定义任务类型。

7. 总结

本文全面介绍了Gradle自定义任务的创建方法。实际开发中可充分利用现有插件提供的丰富任务类型,减少重复开发。

所有代码示例可在GitHub仓库中获取。


原始标题:Gradle Custom Task