Java 依赖冲突(Dependency Conflict)通常指同一个库的不同版本被同时引入,导致编译或运行时出现 NoSuchMethodError、ClassNotFoundException、NoClassDefFoundError 等问题。下面从原因 → 排查 → 解决方案系统说明。
常见原因:
guava:20.0guava:31.0mvn dependency:tree
查看某个依赖:
mvn dependency:tree -Dincludes=com.google.guava
冲突示例:
+- com.a:a:1.0
| \- com.google.guava:guava:20.0
+- com.b:b:1.0
\- com.google.guava:guava:31.0
gradle dependencies
或:
./gradlew app:dependencies
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0</version>
</dependency>
</dependencies>
</dependencyManagement>
dependencies {
implementation('com.google.guava:guava:31.0')
}
Maven:
<dependency>
<groupId>com.a</groupId>
<artifactId>a</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
Gradle:
implementation('com.a:a:1.0') {
exclude group: 'com.google.guava', module: 'guava'
}
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:31.0'
}
}
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
java -verbose:class
或:
jcmd <pid> VM.classloaders
| 库 | 常见冲突 |
|---|---|
| guava | 版本跨度大 |
| jackson | 2.9 vs 2.12 |
| log4j / slf4j | 桥接问题 |
| netty | 版本不兼容 |
| commons-lang | lang vs lang3 |
✅ 项目根 POM / build.gradle 统一版本
✅ 尽量少用 system / provided
✅ 不要随便 shade 第三方包
✅ 微服务/多模块项目用 BOM
✅ CI 中加入依赖检查(如 dependency-check)
如果你愿意,可以:
我可以帮你精准定位并给出修改方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。