目录
- 1. jar包冲突体现
- 2. jar包冲突分类
- 3. 解决
1. jar包冲突体现
构建时没问题, 但运行时会报错. jar冲突一般会报如下异常:
- java.lang.NoClassDefFoundError
- java.lang.NoSuchMethodException
- java.lang.NoSuchFieldException
总结就是找不到预期的Class/Method/Field
但如果构建后是包含该jar包的, 那基本可以确定就是jar冲突了
2. jar包冲突分类
jar包冲突按是否是jar版本的原因, 分为版本问题和包命名问题
- 版本问题
同一个jar引入了两个版本A和B, 构建时取了其中一个版本A, 这时候可能会冲突:
- 如果A是低版本, 代码里用了高版本B的代码, 调用时就会报上述的错
- 如果A是高版本, 但没有兼容B版本, 代码里调用了B版本独有的代码, 也会报错
- 包命名问题
两个不同的jar, 因为命名不规范定义了相同的全路径Class, 构建时没问题两个jar都被构建, 但调用时有可能会报错, 之所以说有可能还与具体的机器相关
- 如果机器先加载A包, 调用A包同路径Class的代码就不会报错
- 如果机器先加载A包, 调用B包同路径Class的代码就会报错
- 如果机器先加载A包, 调用B包同路径Class的代码, 但A包也有相同方法签名的方法, 此时不会报错, 但是调用逻辑可能是非预期但很难发现
3. 解决
只要找到原因, 根据上述两种分类对症下药即可
-
版本问题
必须要求新版本兼容老版本, 强行排去老版本 -
包命名问题
方案1: 要求jar提供方重新打包, 按规范定义Class路径
方案2: 如果对其中一个jar只依赖该Class, 可以自己反编译自己重新定义
方案3: 如果深度依赖, 想办法让双方的该Class互相兼容
方案4: 如果双方包不方便重新打包(如第三方的包), 自己反编译后兼容改造后重新打成新的jar包, 引用新的jar包
方案1最优