Java 依赖冲突是构建工具(Maven / Gradle)在引入多个第三方库时,同一个库的不同版本被同时引入,导致运行时或编译期出现奇怪问题。下面从原理 → 常见表现 → 排查方法 → 解决方案系统讲一下。
你引入的依赖本身又依赖别的库。
A → C:1.0
B → C:2.0
最终项目里 C 有 1.0 和 2.0 两个版本。
Maven 默认:
A → B → C:1.0
D → C:2.0
如果路径长度一样,谁先声明谁生效。
⚠️ 但生效 ≠ 兼容,可能运行时报错。
| 现象 | 说明 |
|---|---|
NoSuchMethodError |
方法不存在(版本不对) |
ClassNotFoundException |
类被覆盖 |
NoClassDefFoundError |
类存在但加载失败 |
LinkageError |
类结构冲突 |
| 本地正常,线上报错 | 依赖树不同 |
mvn dependency:tree
只看某个包:
mvn dependency:tree -Dincludes=com.google.guava
mvn dependency:analyze
./gradlew dependencies
或:
./gradlew app:dependencies
<dependency>
<groupId>com.xxx</groupId>
<artifactId>xxx</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
implementation('com.xxx:xxx:1.0') {
exclude group: 'com.google.guava'
}
✅ 精确控制 ❌ 排除多了可能炸
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
</dependencies>
</dependencyManagement>
dependencies {
implementation platform('com.google.guava:guava:31.1-jre')
}
✅ 统一版本,最干净 ✅ 企业级项目首选
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:31.1-jre'
}
}
⚠️ 可能掩盖真实问题
有些冲突是因为:
✅ 升级到兼容版本 ✅ 查看官方 Release Notes
适用于:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
</plugin>
✅ 重定位包名 ❌ 构建复杂
✅ 解决极端冲突 ❌ 成本高
dependency:tree 看冲突| 库 | 原因 |
|---|---|
| guava | 版本差异极大 |
| jackson | databind / core 不一致 |
| slf4j | 多实现冲突 |
| log4j | 1.x vs 2.x |
| netty | 协议/API 变化 |
Java 依赖冲突不是“删一个版本”,而是“让构建工具只选一个你可控的版本”。
如果你愿意,可以:
dependency:treeNoSuchMethodError)我可以直接帮你给出最优解方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。