在对应依赖的块中添加可精准排除传递依赖,需先用mvn dependency:tree定位冲突jar的groupid和artifactid,再在exclusion中仅填写二者(不写version),排除后须验证编译、依赖树及运行功能。

直接在对应依赖的 <dependency></dependency> 块里加 <exclusions></exclusions>,就能精准切断不需要的传递依赖——这不是“删包”,而是告诉 Maven:“这个依赖我只要主干,不要它带的某些枝杈”。
明确目标:先搞清谁该被排除
盲目排除容易出问题。得先确认两点:
- 哪个依赖引入了你不想要的 jar(比如
hadoop-client拉进了旧版log4j) - 那个 jar 的
groupId和artifactId是什么(不是文件名,是 pom 中声明的坐标)
用命令 mvn dependency:tree -Dverbose 查依赖树,找到冲突路径,再定位具体坐标。IDE(如 IntelliJ)的 Maven 工具窗也能展开查看。
标准写法:在 dependency 内部嵌套 exclusion
<exclusion></exclusion> 必须写在某个具体 <dependency></dependency> 里面,不能独立存在。格式固定:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
<dependency><groupid>org.apache.hadoop</groupid><artifactid>hadoop-client</artifactid><version>3.3.1</version><exclusions><exclusion><groupid>log4j</groupid><artifactid>log4j</artifactid></exclusion><exclusion><groupid>org.slf4j</groupid><artifactid>slf4j-log4j12</artifactid></exclusion></exclusions></dependency>
注意:<exclusion></exclusion> 里只填 groupId 和 artifactId,不写 <version></version> ——版本由被排除的依赖决定,这里无需指定。
批量排除或统一管控
如果多个依赖都带同一个干扰项(比如都传入了 commons-logging),不用每个都手写 exclusion:
- 在父 POM 的
<dependencymanagement></dependencymanagement>中统一管理依赖版本,再配合 exclusion 控制引入 - 或把 exclusion 写在父 POM 的公共依赖里,子模块自动继承
- 极端情况(如彻底屏蔽某类底层组件),可用通配符:
<groupid>*</groupid><artifactid>*</artifactid>,但慎用——可能误伤功能
排除后要验证是否生效
改完 pom 后别急着跑代码,执行:
-
mvn clean compile确保编译通过 -
mvn dependency:tree | grep "你要排除的 artifactId"确认它已不在树中 - 启动应用,检查日志、功能是否正常(尤其注意被排除的包是否被其他地方显式引入)
常见陷阱:排除了 A 依赖里的 B,但项目里又直接声明了 B 的另一个版本——这时实际生效的是直接声明的那个,exclusion 不起作用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










