设为0秒可强制每次检查SNAPSHOT或动态版本;需在根项目build.gradle中配置configurations.all { resolutionStrategy { cacheChangingModulesFor 0, 'seconds' } },单位必须小写准确,且要覆盖所有配置。

直接设为 0 秒即可强制每次检查 SNAPSHOT 或动态版本。Gradle 默认对 changing 模块(如 1.0-SNAPSHOT、1.+、或显式声明 changing = true 的依赖)缓存 24 小时,这会导致你本地改了快照模块却拉不到最新版。关键不是“能不能设”,而是“必须设对位置和单位”。
configurations.all { resolutionStrategy { cacheChangingModulesFor(...) } } 必须写对作用域
这段配置不能放在 dependencies 块里,也不能只写在某个子项目中——它要作用于所有配置(compileClasspath、runtimeClasspath、testRuntimeClasspath 等)。常见错误是只加在 subprojects 里却漏了根项目的 configurations。
- 正确位置:项目根目录的
build.gradle(Groovy)或build.gradle.kts(Kotlin)最外层 - Groovy 写法:
configurations.all { resolutionStrategy { cacheChangingModulesFor 0, 'seconds' } } - Kotlin DSL 写法:
configurations.configureEach { resolutionStrategy { cacheChangingModulesFor(0, "seconds") } } - 如果用了
java-library插件,还要注意apiElements和runtimeElements这类变体配置也得覆盖到
cacheChangingModulesFor 的单位和参数不能错
这个方法只接受两个参数:数值 + 字符串单位。单位必须是小写且拼写准确,'seconds' 不是 'sec','minutes' 不是 'min'。传错单位 Gradle 不报错,但配置不生效——你改了代码,构建还是用着 24 小时前的 SNAPSHOT。
- 合法单位只有:
'seconds'、'minutes'、'hours'、'days' - 数值可以是整数或小数,比如
cacheChangingModulesFor 30, 'seconds'表示半分钟检查一次 - 设为
0, 'seconds'是最激进的做法,适合开发阶段;CI 流水线可设为1, 'minutes'平衡稳定性与新鲜度 - 注意:这个设置不影响非 changing 模块(如
1.0.0),它们走的是另一套缓存策略(cacheDynamicVersionsFor或默认 24 小时)
为什么改了还是没拉新?检查这些隐藏点
即使配置写对了,仍可能“看起来没生效”,原因往往不在缓存时间本身:
-
./gradlew --refresh-dependencies手动触发刷新,确认是否真从远程拉取(看日志里有没有Downloading...) - 私有仓库未配置
maven { allowInsecureProtocol = true }(若用 HTTP)或认证失效,导致 fallback 到本地缓存 - 本地
.gradle/caches/modules-2/files-2.1/下对应路径里存在损坏的.module元数据文件,删掉整个坐标目录再试 - IDEA 或 AS 同步时用了离线模式(Offline work),勾选了
File → Settings → Build → Gradle → Offline work - 某些插件(如
com.github.ben-manes.versions)会绕过 resolutionStrategy,需单独配置其检查策略
真正起效的标志不是构建快慢,而是每次运行 ./gradlew dependencies --configuration compileClasspath 时,看到 SNAPSHOT 依赖的 resolved version 后面带上了时间戳(如 1.0-SNAPSHOT-20261020.032145-123),而不是固定不变的旧哈希。这个细节很多人忽略,但它才是变化依赖“活”起来的唯一证据。











