当前位置: 首页 > ai >正文

JAR 包冲突排雷指南:原理、现象与 Maven 一站式解决

一次诡异的 NoSuchMethodError,90 % 都是由同一个类在多个版本间反复横跳引起的。

一、为什么会冲突?

1.1 冲突产生的根因:同一个类在 classpath 中出现多次,且版本不同

以开篇例子为例:

  • a.jar → 引入 c.jar(version-1)
  • b.jar → 引入 c.jar(version-2)

项目运行时 “先到先得” 的类加载顺序导致:

加载顺序结果
先加载 c-1低版本类 ClassA 缺失 methodA()NoSuchMethodError
先加载 c-2高版本向下兼容,一切正常

1.2 典型异常对照表

异常含义
java.lang.ClassNotFoundException版本里根本没有这个类
java.lang.NoSuchMethodError版本里有类,但没有这个方法
java.lang.NoSuchFieldError版本里有类,但没有这个字段
java.lang.LinkageError类加载冲突导致链接失败

二、排查思路:三步定位法

Step 1:打印依赖树 —— 用 Maven 做“CT 扫描”

mvn dependency:tree -Dverbose -Dincludes=:notify-common

输出示例(已高亮冲突):

[INFO] +- com.taobao.wlb:bis-core:jar:1.0-SNAPSHOT
[INFO] |  \- com.taobao.logistics:schedule-client:1.1.1
[INFO] |     \- (com.taobao.notify:notify-common:1.8.15 - omitted for conflict with 1.8.19.26)
[INFO] \- com.taobao.notify:notify-tr-client:1.8.19.26
[INFO]    \- com.taobao.notify:notify-common:1.8.19.26
  • 冲突版本1.8.15 vs 1.8.19.26
  • 谁是引入者schedule-client:1.1.1 拉来了旧版本。

Step 2:运行时类加载详情 —— JVM 的“X 光片”

启动参数加 -verbose:class,查看实际从哪个 JAR 加载:

[Loaded com.xxx.ClassA from file:/.../c-1.0.jar]

Step 3:IDE 可视化 —— 适合“肉眼”快速定位

  • Eclipse:打开 pom.xml → Hierarchy → 搜索冲突包
  • IDEApom.xml → Diagrams → Show Dependencies

三、解决手段:让“对的版本”留下来

3.1 排除旧版本(Maven)

找到引入冲突的坐标,在 pom.xml 中显式排除:

<dependency><groupId>com.know.diamond</groupId><artifactId>diamond-sdk</artifactId><version>2.0.5</version><exclusions><exclusion><groupId>com.google.collections</groupId><artifactId>google-collections</artifactId></exclusion></exclusions>
</dependency>

3.2 统一版本:使用 dependencyManagement

<dependencyManagement><dependencies><dependency><groupId>com.taobao.notify</groupId><artifactId>notify-common</artifactId><version>1.8.19.26</version></dependency></dependencies>
</dependencyManagement>

3.3 全局分析:一次性导出完整树

mvn dependency:tree -Dverbose > tree.log

用文本编辑器搜索冲突 groupId:artifactId,快速定位所有叶子节点。


四、小结:一张图看懂排包流程

┌────────────┐      ┌──────────────┐      ┌────────────────┐
│ NoSuchM··· │  →   │ dependency:  │  →   │ exclusion /    │
│ LinkageErr │      │ tree -Dverbose│      │ dependencyMgmt │
└────────────┘      └──────────────┘      └────────────────┘↑                   ↑                     ↑运行报错           快速定位冲突            精准解决

一句话记住:先 tree 找元凶,再 exclusion 干掉它,最后用 dependencyManagement 统一版本,冲突永不再现!

http://www.xdnf.cn/news/15372.html

相关文章:

  • 机载激光雷达目标识别:从点云到凝视成像的算法全景
  • Datawhale AI夏令营——用户新增预测挑战赛
  • xss-lab靶场通关
  • 苦练Python第18天:Python异常处理锦囊
  • 从 JSON 到 Python 对象:一次通透的序列化与反序列化之旅
  • 云原生技术与应用-Containerd容器技术详解
  • Android系统的问题分析笔记 - Android上的调试方式 bugreport
  • RAG索引流程中的文档解析:工业级实践方案与最佳实践
  • iOS —— 网易云仿写
  • 大数据系列之:通过trino查询hive表
  • 直播推流技术底层逻辑详解与私有化实现方案-以rmtp rtc hls为例-优雅草卓伊凡
  • 在Linux下git的使用
  • 量子计算新突破!阿里“太章3.0”实现512量子比特模拟(2025中国量子算力巅峰)
  • MYOJ_8512:CSP初赛题单1:计算机常识
  • 计算机网络通信的相关知识总结
  • Linux进程优先级机制深度解析:从Nice值到实时调度
  • 图机器学习(1)——图论基础
  • Django Admin 配置详解
  • 【C语言进阶】指针面试题详解(2)
  • 玩转Docker | 使用Docker部署TeamMapper思维导图应用程序
  • 使⽤Pytorch构建⼀个神经⽹络
  • Android Studio C++/JNI/Kotlin 示例 三
  • IDEA实现纯java项目并打包jar(不使用Maven,Spring)
  • Bash vs PowerShell | 从 CMD 到跨平台工具:Bash 与 PowerShell 的全方位对比
  • 单片机(STM32-串口通信)
  • 名片管理系统IV
  • 位置编码类型彩色图解
  • android Perfetto cpu分析教程及案例
  • (5)LangGraph4j框架ReActAgent实现
  • 核电概念盘中异动,中核科技涨停引领板块热度