最常用、最精准的解决方式是在对应依赖中用排除冲突的传递依赖,即阻止特定依赖带入指定子依赖;需先通过mvn dependency:tree -dincludes=groupid:artifactid定位冲突来源,在引入旧版本的直接依赖内配置,并配合统一锁定版本。

直接在对应依赖中用 <exclusions></exclusions> 排除冲突的传递依赖,是最常用、最精准的解决方式。关键不是“删掉什么”,而是“阻止谁带入谁”。
先定位冲突来源
执行命令查看依赖树,重点找带 omitted for conflict 的行:
mvn dependency:tree -Dincludes=groupId:artifactId
例如查 Jackson 冲突:
mvn dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind
输出会显示多个版本(如 2.11.0、2.13.3)分别从哪条路径引入,比如:
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.7.0[INFO] | \- com.fasterxml.jackson.core:jackson-databind:jar:2.13.3[INFO] \- com.example:legacy-sdk:jar:1.2[INFO] \- com.fasterxml.jackson.core:jackson-databind:jar:2.11.0 (omitted for conflict)
说明 2.11.0 被跳过,但它的存在本身可能已造成编译或运行时异常(如方法签名不兼容)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
在父依赖中写
找到引入了旧版的那个直接依赖(这里是 legacy-sdk),在其 <dependency></dependency> 块内添加排除:
注意点:
-
必须写全
<groupid></groupid>和<artifactid></artifactid>,大小写、连字符都不能错 - 一个
<dependency></dependency>可含多个<exclusion></exclusion>,适合一次切断多个干扰项 - 排除后,该依赖自身功能不受影响,只是不再“顺手带上”被排除的 jar
配合 锁定主版本
仅靠排除容易遗漏,尤其在多模块项目中。建议在根 pom 的 <dependencymanagement></dependencymanagement> 中统一指定你认可的版本:
这样所有子模块即使没声明 version,也会默认使用 2.13.3;若某处仍引入旧版,Maven 仲裁机制会自动覆盖,且 mvn dependency:tree 中会明确标出 “version managed from …”。
验证是否生效
改完 pom 后务必重新执行:
mvn clean compilemvn dependency:tree | grep jackson-databind
理想结果是只看到一行目标版本(如 jackson-databind:2.13.3),且没有 omitted for conflict 提示。再跑单元测试或启动应用,确认 NoSuchMethodError 或 ClassNotFoundException 类异常消失。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










