gradle远程构建缓存需满足三前提:gradle≥4.3、禁用非确定性任务、统一jdk及参数;配置artifactory url与认证;显式声明可缓存任务并排除不可缓存操作;通过build scan和日志验证跨机器复用效果。

Gradle 组件缓存(Build Cache)在多台机器间共享构建成果,核心是启用远程构建缓存服务,并确保所有开发机和 CI Agent 统一配置、一致行为。它不是“自动同步”的本地缓存,而是通过哈希校验复用任务输出的分布式机制——只要输入一致,无论在哪台机器上执行,都能直接拉取已构建好的 class 文件、资源处理结果或测试报告。
启用远程构建缓存的前提条件
必须满足以下三点,否则跨机器复用会失败或降级为本地缓存:
- Gradle 版本 ≥ 4.3(推荐 7.6+ 或 8.x),低版本不支持 Kotlin 编译缓存等关键能力;
-
项目中禁用非确定性任务:例如带时间戳的 Manifest、随机生成的版本号、未锁定的依赖动态版本(如
1.2.+); -
所有机器使用兼容的 JDK 和构建参数:比如统一用 JDK 17、禁用
-XX:+UseParallelGC等可能影响字节码生成的 JVM 参数。
配置远程缓存服务(以 Artifactory 为例)
Artifactory 是最常用且生产就绪的远程缓存后端。在 gradle.properties 中添加:
org.gradle.caching=true org.gradle.caching.remote.http.basic.auth.username=build-cache-user org.gradle.caching.remote.http.basic.auth.password=api-token-or-password org.gradle.caching.remote.url=https://artifactory.example.com/artifactory/gradle-build-cache/
注意:url 必须以 / 结尾;认证凭据建议通过 CI 环境变量注入,避免硬编码;Artifactory 需开启 Build Cache 仓库类型并配置权限策略。
让缓存真正生效的关键实践
光配对 URL 不够,还需主动控制哪些任务可缓存、哪些必须跳过:
-
显式声明可缓存的任务:在
build.gradle中对高耗时但确定性强的任务启用缓存,例如:
tasks.withType(JavaCompile).configureEach {
enabled = true
outputs.cacheIf { true }
}
tasks.withType(Test).configureEach {
outputs.cacheIf { !System.getenv("CI").toBoolean() } // CI 上允许缓存测试输出,本地可选关
}
-
排除不可缓存的操作:比如打包含时间戳的 fat jar、运行集成测试、执行脚本类任务(
Exec)默认不缓存,需手动outputs.cacheIf并明确定义输入输出; -
统一构建环境变量:在 CI 和本地都设置
org.gradle.configuration-cache=true和org.gradle.parallel=true,避免因配置阶段差异导致缓存键不匹配。
验证与调试跨机器缓存是否起作用
不用等 CI 流水线跑完,用两条命令快速确认:
- 在机器 A 上执行:
./gradlew build --build-cache --scan,查看 Build Scan 中 “From cache” 的任务数量; - 在机器 B 上清空本地缓存(
rm -rf $HOME/.gradle/caches/build-cache-),再执行相同命令,观察是否仍显示 “From cache”,且来源是远程 URL 而非local; - 检查 Artifactory 后台的缓存仓库访问日志,确认有
GET和PUT请求进出。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











