Gradle不提供传统生命周期监听器,但可通过buildStarted/buildFinished、TaskExecutionGraph和BuildEventsListenerRegistry三种方式实现构建监控。

Gradle 本身不提供传统意义上的“生命周期监听器”API(如 Maven 的 BuildListener),但可以通过多种官方支持的方式,在构建的不同阶段插入自定义逻辑,实现对构建过程的监控和干预。核心方式包括:使用 buildFinished / buildStarted(Project API)、TaskExecutionGraph 监听、以及更现代的 BuildEventsListenerRegistry(Gradle 6.1+ 推荐)。
使用 Project.buildFinished 和 buildStarted(简单全局钩子)
这是最轻量、兼容性最好的方式,适用于需要在构建开始前或结束后执行一次性操作(如统计耗时、发送通知、清理临时资源)。
- 适用场景:不需要感知具体任务、只需宏观控制流(比如记录总耗时、捕获构建失败异常)
-
写法位置:放在
build.gradle或settings.gradle中(推荐放在settings.gradle以确保最早生效) -
注意点:这两个闭包只在构建生命周期顶层触发一次,无法获取 Task 级别细节;
buildFinished的参数包含BuildResult,可判断是否成功
示例:
// settings.gradle
gradle.buildStarted { buildStart ->
println "[BUILD] Started at ${new Date()}"
}
<p>gradle.buildFinished { buildResult ->
def duration = System.currentTimeMillis() - buildStart.time
println "[BUILD] Finished in ${duration}ms"
if (buildResult.failure) {
println "[ERROR] Build failed: ${buildResult.failure}"
}
}监听 Task 执行图(TaskExecutionGraph)
当需要在所有 Task 执行前/后统一处理(例如批量修改 JVM 参数、注入通用日志、跳过特定 Task),可用 gradle.taskGraph。
立即学习“Java免费学习笔记(深入)”;
- 适用场景:需知道哪些 Task 将被执行、按依赖顺序做预处理(如设置系统属性、检查环境)
-
关键时机:
whenReady(图生成完毕但未执行)、beforeExecute(每个 Task 执行前)、afterExecute(每个 Task 执行后) -
限制:不能在
whenReady中修改 Task 图结构(如添加/删除 Task),仅能读取
示例(打印所有即将执行的 Task 名称):
// build.gradle
gradle.taskGraph.whenReady { graph ->
println "[GRAPH] Tasks to execute: ${graph.allTasks*.path}"
}
<p>gradle.taskGraph.afterExecute { task, result ->
if (result.failure) {
println "[TASK FAILED] ${task.path}: ${result.failure}"
} else {
println "[TASK OK] ${task.path}"
}
}使用 BuildEventsListenerRegistry(Gradle 6.1+ 推荐)
这是 Gradle 官方推荐的、面向事件驱动的监听机制,支持细粒度监听构建事件(如 TaskStarted、TaskFinished、ConfigurationStarted 等),且可在插件中安全注册。
- 适用场景:需要精确捕获 Task 生命周期事件、构建配置过程、甚至依赖解析细节;适合开发自定义插件
-
注册方式:通过
project.getExtensions().getByType(BuildEventsListenerRegistry.class)获取注册器 -
注意点:必须在
afterEvaluate或插件apply阶段之后注册;事件监听器需实现对应接口(如TaskExecutionListener)
示例(监听 Task 执行耗时):
// build.gradle
if (gradle.gradleVersion >= "6.1") {
gradle.afterProject { project ->
project.extensions.getByType(BuildEventsListenerRegistry.class).onTaskCompletion { event ->
if (event instanceof TaskSuccess) {
println "[TASK] ${event.descriptor.path} finished in ${event.endTime - event.startTime}ms"
} else if (event instanceof TaskFailure) {
println "[TASK FAIL] ${event.descriptor.path}: ${event.failure}"
}
}
}
}结合 Logging 或自定义 Plugin 做生产级监控
单纯打印日志不够健壮。实际项目中建议封装为可复用插件,并集成结构化日志(如 JSON 输出)、指标上报(Prometheus)、或失败自动截图等能力。
- 把监听逻辑抽成独立
BuildMonitorPlugin,通过apply plugin: 'build-monitor'启用 - 避免在监听器中做耗时 I/O(如远程 HTTP 请求),否则拖慢构建;可异步缓冲后批量提交
- 使用
gradle.startParameter区分命令行参数(如--scan、--no-daemon),动态调整监听行为
Gradle 构建监听不是黑盒魔法,关键是选对时机和 API 层级:宏观用 buildStarted/Finished,任务级用 TaskExecutionGraph,精细事件用 BuildEventsListenerRegistry。不复杂但容易忽略注册时机和作用域范围。


















