Gradle原生依赖锁定不支持按单个依赖更新,仅支持按配置粒度操作;需用--configuration指定配置名(如implementation),配合模块前缀(如:app:)执行--write-locks命令,并确保该配置已声明且含实际依赖。

只更新某个配置的依赖锁记录
Gradle 原生依赖锁定(dependencyLocking)默认对所有可锁定配置(如 implementation、testImplementation、runtimeClasspath 等)一并生成或更新锁条目。但你**无法直接指定“只更新某一个依赖”**,只能按配置粒度控制——比如只更新 :app:implementation 对应的锁,而不碰 :lib:testRuntimeOnly。
实际操作中,所谓“只更新指定依赖”,本质是:先让该依赖所在的配置参与解析,再触发写锁。关键靠两点:缩小作用范围 + 精确指定配置。
- 用
--configuration参数限定配置名,例如:./gradlew :app:dependencies --write-locks --configuration implementation - 必须确保该配置已声明且有实际依赖(空配置不会写入任何条目)
- 若依赖在
api或compileOnly中,需显式指定对应配置名,不能只写implementation - 多模块项目下,不加模块前缀(如
:app:)时,命令只作用于根项目,可能无效果
为什么 --include-build 或 --refresh-dependencies 不起作用
这两个参数和依赖锁定无关:--refresh-dependencies 强制重新解析远程依赖元数据,但不会改写 gradle.lockfile;--include-build 用于复合构建,不影响锁文件生成逻辑。试图靠它们“单独刷新某个依赖版本”会失败——Gradle 锁定机制只响应 --write-locks 触发的完整配置解析流程。
常见误操作:
- 运行
./gradlew build --refresh-dependencies后发现gradle.lockfile没变 → 正常,这个命令根本不触发写锁 - 在
build.gradle中把某个依赖从1.2.3改成1.2.4,然后只跑./gradlew compileJava→ 锁文件不会更新,因为没调用--write-locks - 用了
org.gradle.dependency-locking.ignoreFailures=true→ 即使锁校验失败也不报错,容易掩盖版本不一致问题
想“只锁定 A 依赖,不管 B 依赖”?得换思路
Gradle 原生锁定是全量、配置级的,不支持按 artifactId 过滤。如果你真需要隔离控制,只有两个务实路径:
- 把目标依赖(如
com.example:core)单独抽成一个独立配置,比如自定义coreLibconfiguration,再用dependencyLocking { lockAllConfigurations() }+--configuration coreLib配合使用 - 放弃原生锁定,改用
nebula.dependency-lock插件,它支持lockFile = 'core.lock'+include 'com.example:core'这类白名单式声明(但会失去 Gradle 官方维护保障) - 动态版本(如
1.+)在启用锁定后直接报错,所以必须先把所有目标依赖改成固定版本,否则--write-locks会中断
最易被忽略的一点:锁文件生效的前提不是“生成了”,而是“被 Git 提交且 CI 中未跳过校验”。哪怕你精确执行了 --configuration runtimeClasspath,只要 gradle.lockfile 没进仓库,或者 CI 跑的是 --no-daemon --offline,锁定就等于没开。











