依赖约束(constraints)是Gradle 8起推荐替代force的声明式版本控制机制,它不引入依赖而施加解析规则,通过strictly/prefer校验整个依赖图,冲突时明确报错而非静默覆盖。

依赖约束(Dependency Constraints)是 Gradle 提供的声明式版本控制机制,它不直接引入依赖,而是在整个依赖图中“施加规则”,从源头上防止传递性依赖随意拉入不兼容或不安全的版本。它比 force 更精准、更符合语义,尤其适合治理大型项目中由多层第三方库引发的版本污染问题。
为什么约束比 force 更可靠
force 是粗暴覆盖,会无视依赖本身的兼容性声明;而 constraints 是在解析前就设定边界,Gradle 会在依赖图构建阶段主动校验并拒绝违反约束的路径。当多个约束冲突时,Gradle 会报错而非静默降级,迫使开发者显式决策。
在 dependencies 块中声明约束
约束必须写在 dependencies 块内,使用 constraints 闭包,且仅对可解析的 configuration 生效(如 implementation、api 等):
Groovy DSL:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
dependencies {
constraints {
implementation('com.google.guava:guava') {
version { strictly '32.0.0-jre' }
because '31.x has known CVEs and breaks JDK 17+ annotation processing'
}
implementation('org.slf4j:slf4j-api') {
version { prefer '2.0.12' }
because 'Spring Boot 3.2+ requires slf4j 2.x'
}
}
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.github.ben-manes.caffeine:caffeine'
}
Kotlin DSL:
dependencies {
constraints {
implementation("com.google.guava:guava") {
version {
strictly("32.0.0-jre")
}
because("31.x has known CVEs and breaks JDK 17+ annotation processing")
}
implementation("org.slf4j:slf4j-api") {
version {
prefer("2.0.12")
}
because("Spring Boot 3.2+ requires slf4j 2.x")
}
}
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.github.ben-manes.caffeine:caffeine")
}
约束与传递依赖的协同控制
约束本身不影响依赖是否被拉入,但它能和 transitive = false 或 exclude 配合,形成分层治理:
- 用
strictly锁定核心基础库(如 guava、jackson-core),杜绝任何偏离 - 对非关键但易出问题的传递依赖(如 log4j-over-slf4j),配合
exclude主动剔除 - 对版本范围较宽泛的库(如
commons-lang3:[3.12,)),用prefer引导解析倾向,保留一定弹性
验证约束是否生效
运行以下命令检查约束是否被正确应用:
./gradlew app:dependencies --configuration runtimeClasspath --include-build
输出中会明确标注 (forced) 或 (constraint),并显示最终选中的版本是否匹配你的 strictly 或 prefer 声明。若某依赖仍解析到被约束禁止的版本,Gradle 会直接构建失败,并提示具体冲突点。

















