gradle 中编写自定义 task 和嵌入 groovy 脚本逻辑,核心是利用其 dsl 扩展构建行为:可用 tasks.register() 定义延迟执行的 task,通过 @inputfile/@outputfile 支持增量构建,直接在 build.gradle 中写 groovy 代码(如变量、方法、配置),复杂逻辑可提取至 buildsrc 或 external script 复用。

在 Gradle 中编写自定义 Task 和嵌入 Groovy 脚本逻辑,核心是利用 Gradle 的 DSL(基于 Groovy 或 Kotlin)扩展构建行为。Java 项目中通常用 Groovy 编写的 build.gradle,天然支持直接写 Groovy 代码,无需额外配置。
定义一个简单的自定义 Task
Gradle 提供了多种方式声明 Task,最常用的是 tasks.register()(推荐,延迟执行)或 task 闭包(旧式,立即配置)。
示例:定义一个打印当前时间的 Task
tasks.register('printTime') {
doLast {
println "当前时间: ${new Date()}"
}
}
运行:./gradlew printTime 即可执行。
注意:doLast 是 Task 执行阶段的动作;若需在配置阶段运行,用 doFirst 或直接写在闭包内(但不推荐含副作用的逻辑)。
创建带输入输出、支持增量构建的 Task
让 Task 可被跳过(如输入未变),需声明 inputs 和 outputs,并继承 DefaultTask 或使用注解。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
示例:一个将文本文件转为大写的简单转换 Task
class UppercaseTask extends DefaultTask {
@InputFile
final RegularFileProperty inputFile = project.objects.fileProperty()
@OutputFile
final RegularFileProperty outputFile = project.objects.fileProperty()
@TaskAction
void process() {
def content = inputFile.get().asFile.text
outputFile.get().asFile.write content.toUpperCase()
}
}
tasks.register('uppercase', UppercaseTask) {
inputFile.set(file('src/main/resources/input.txt'))
outputFile.set(file('build/output.txt'))
}
这样 Gradle 就能自动判断是否跳过该 Task —— 只要 input.txt 和 output.txt 时间戳/内容未变,执行 uppercase 时会显示 UP-TO-DATE。
在 build.gradle 中直接写 Groovy 脚本逻辑
Gradle 构建脚本本身就是 Groovy(或 Kotlin)脚本,可直接调用 Groovy API、定义变量、方法、甚至类。
- 定义本地变量:
def versionName = '1.2.3' - 写工具方法:
def parseVersion = { String v -> v.split('\.').collect { it.toInteger() } } - 读取外部配置:
def props = new Properties(); file('gradle.properties').withInputStream { props.load(it) } - 动态配置依赖:
dependencies { implementation "com.example:lib:$versionName" }
这些逻辑放在 build.gradle 任意位置(只要不在 Task 内部且需提前求值)都有效。注意避免在 doLast 外直接执行耗时操作,否则每次运行 Gradle 都会执行(影响性能)。
复用逻辑:提取到 buildSrc 或独立脚本
当 Groovy 逻辑变复杂,建议移出主脚本:
-
buildSrc:在项目根目录建
buildSrc/src/main/groovy/,放自定义 Task 类或工具类,会自动编译进构建 classpath,所有 build.gradle 可直接 import 使用。 -
external script:用
apply from: 'scripts/utils.gradle'引入外部 Groovy 脚本,适合共享配置片段。
例如 scripts/version.gradle 中写:ext.appVersion = project.hasProperty('release') ? '2.0.0' : '2.0.0-SNAPSHOT',然后在主脚本中 apply from: 'scripts/version.gradle',再用 appVersion。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










