在Gradle中用exclude排除传递依赖,需在具体依赖声明内精准切断某条依赖路径,指定完整正确的group和module;可单个排除、多个排除、关闭全部传递依赖或批量统一排除,排除后须用dependencies命令验证。

在 Gradle 中用 exclude 排除传递依赖,关键是在具体依赖声明内部写排除规则,而不是全局乱删。它不是“去掉某个 jar”,而是精准切断某条依赖路径上你不想要的间接引入。
在单个依赖里排除指定模块
最常用、最安全的方式。找到那个“带了多余依赖”的直接依赖,在它的声明块中用 exclude 指定要砍掉的 group 和 module:
-
group对应 Maven 坐标中的groupId(如org.slf4j) -
module对应artifactId(如slf4j-simple) - 两者必须写全,且大小写、连字符都要完全一致
示例:
implementation('org.apache.kafka:kafka-clients:3.7.0') {
exclude group: 'org.slf4j', module: 'slf4j-simple'
}
如果要排除多个模块,用分号隔开:
implementation('com.example:lib-a:1.5') {
exclude group: 'com.google.guava', module: 'guava'
exclude group: 'junit', module: 'junit'
}
排除整个依赖链(慎用)
用 transitive = false 关闭某个依赖的所有传递依赖:
implementation('org.springframework.boot:spring-boot-starter-web') {
transitive = false
}
这会把 spring-web、jackson-databind 等一并干掉,后续得手动补全所有必需依赖。适合高度定制场景,日常开发不建议。
批量统一排除(按规则清理)
当多个依赖都引了同一个“问题模块”(比如多个 SDK 都带旧版 commons-collections),可在 configurations.all 中统一处理:
configurations.all {
exclude group: 'commons-collections', module: 'commons-collections'
exclude group: 'org.apache.logging.log4j', module: 'log4j-core'
}
这种方式作用于所有 classpath(compileClasspath、runtimeClasspath 等),但要注意别误伤真正需要的依赖。
验证是否生效
排除后必须验证,运行命令查看实际依赖树:
./gradlew app:dependencies --configuration runtimeClasspath | grep -A 3 -B 3 "slf4j-simple"
如果输出里不再出现目标模块,说明排除成功。常见失败原因:
-
group或module名拼错(注意大小写和横线) - 其他依赖路径又悄悄引入了同一模块
- 用了
api或compileOnly等配置,导致排除没覆盖到对应 classpath
不复杂但容易忽略。


















