美文网首页
引入的Jar 冲突问题

引入的Jar 冲突问题

作者: 随风_d6a2 | 来源:发表于2023-03-27 22:01 被阅读0次

在项目的开发中无法避免的遇到一些奇怪的问题尤其是Jar的管理方便更让人恼火。

依赖传递的原则

几乎所有的Jar包冲突都和依赖传递原则有关。下面说明Maven的依赖传递原则。

最短路径优先原则

假如引入了两个Jar包A、B,都依赖Z这个Jar包

A -> Y -> X -> Z(2.5)

B -> X -> Z(2.0)

那么最终生效的是Z(2.0)版本

最先声明优先原则

如果路径长短一样,优先选择先声明的那个

A -> Z(3.0)

B -> Z(3.5)

这里A最先声明,所以依赖Z(3.0)

引起冲突的原因

假设我们项目中依赖了A和B两个Jar包。而A和B各自又有以下传递依赖

A -> X -> Z(2.0)

B -> X -> Y -> Z(2.5)

那最终系统中Z包就产生了冲突,2.0和2.5两个版本冲突。但是classpath中只会依赖一个版本的Z包。根据传递依赖的最短路径优先原则,最终依赖的应该是2.0版本。

如果Y包中用了Z包2.5版本中新的method时候,当运行到这段逻辑的时候。就会报NoSuchMethodError了。因为本来依赖的是2.5版本,但是因为Jar包冲突Maven选择了2.0版本,2.0版本中又没有这个新的method,导致出错。

但要注意的是,不是所有冲突都会引起运行异常。相反,大部分公司的项目都会有一些Jar包冲突,但其实没有造成运行时的问题。

这是因为很多传递依赖的Jar包,不管是2.0版本也好,2.5版本也好,都可以运行。
当出现jar包冲突时,一般建议采用高版本的jar包,因为高版本的jar在设计时一般会考虑向下兼容。只有高版本Jar包不向下兼容才有可能导致这样的问题。

定位冲突

使用插件MavenHelper。具体使用可以参考下方连接,以后使用到则补充。

MavenHelper
https://blog.csdn.net/qq_41149775/article/details/127076930?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127076930%22%2C%22source%22%3A%22qq_41149775%22%7D

解决冲突的几个简单技巧

依赖排除法

将冲突的依赖排除。<exclusions> 使用Maven工具也可以右键->Exclude

image.png
版本锁定法

通过指定版本的方式打破2个依赖传递原则,优先级最高。


image.png
Maven 加载Jar包的优先级顺序

项目子Module对应的Jar包 > 本地仓库Jar包 > 远程仓库的Jar包

————————————————
版权声明:本文为CSDN博主「穿金头戴帽」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41149775/article/details/127076733

相关文章

网友评论

      本文标题:引入的Jar 冲突问题

      本文链接:https://www.haomeiwen.com/subject/mettddtx.html