Maven 依赖冲突是 Java 项目中非常常见的问题,通常表现为:ClassNotFoundException、NoSuchMethodError、版本不兼容、运行时行为异常等。下面从「原理 → 排查 → 解决」系统讲一下。
Maven 使用 “最短路径优先 + 声明顺序优先” 原则来选版本:
路径最短优先
路径相同,先声明优先
pom.xml 出现,用谁⚠️ 这就可能导致:
mvn dependency:tree
查看依赖树:
[INFO] com.demo:app:jar:1.0
[INFO] +- org.apache.commons:commons-lang3:3.12.0
[INFO] +- com.google.guava:guava:30.1.1
[INFO] | \- com.google.code.findbugs:jsr305:3.0.2
mvn dependency:tree -Dincludes=commons-lang3
<dependencyManagement>(最推荐)统一版本控制,不影响依赖树结构:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-lang3</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
</dependencyManagement>
✅ 优点:
<dependencies>
<dependency>
<groupId>commons-lang3</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
✅ Maven 会优先用你显式声明的版本
<exclusions> 排除冲突依赖<dependency>
<groupId>com.example</groupId>
<artifactId>some-lib</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>commons-lang3</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
</exclusions>
</dependency>
✅ 适合:
spring-boot-dependencies<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
Spring Boot 已经帮你管理了绝大多数依赖版本。
NoSuchMethodError: com.fasterxml.jackson.databind.ObjectMapper
✅ 解决:
<dependencyManagement>
<dependency>
<groupId>com.fasterxml.jackson</groupId>
<artifactId>jackson-bom</artifactId>
<version>2.15.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencyManagement>
Multiple binding
✅ 解决:
✅ 推荐做法:
dependencyManagement 控制版本mvn dependency:treeexclusions❌ 不推荐:
如果你愿意,可以把:
mvn dependency:tree 输出发给我,我可以帮你精准定位并给出修改方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。