jar包冲突解决思路

工作中,难免会因为各种原因需要对项目jar包进行升级,一升级,就会碰到各种jar包冲突问题,这时候就需要我们能很快定位冲突的位置,以及如何快速调整依赖。

首先,我们通常说的jar包冲突到底是指什么?

jar包冲突本质是因为项目中存在多个同包同名类,而虚拟机加载了我们不期望加载的类,这些类可能已经过时,缺失了一些新的方法或逻辑,也有可能太新,需要引入更高版本其他jar包的内容,这样就会导致项目中出现NoSuchMethodError、NoSuchMethodError、NoClassDefFoundError、NoClassDefFoundExeption等类或方法缺失甚至逻辑不对的问题。

其次,要理解jar包冲突,首先要了解几个相关知识点:

1、类加载机制的问题,类是如何被类加载器加载到虚拟机的,双亲委派模型是什么?

参考:https://blog.csdn.net/firstendhappy/article/details/101422505

2、同一加载器加载的类中有多个同包同名类问题?会怎么加载?

这个问题其实很简单,顺序优先原则,一个类加载器加载的目录中如果存在多个同名类,只会加载顺序靠前的类,后续的类自动忽略,这种情况在以前手工导入jar包的项目中会经常出现,一般都是引入不同版本的jar包导致的,很少会有不同jar包有同名类的情况,毕竟我们的包名命名规则,就是用来尽量保证不会出现跟别人一样的同包同名类。

3、maven项目jar包的引入

maven项目是通过pom.xml文件配置dependencies引入jar包,引入的规则,有最短路径原则,顺序优先原则,exclude排除等等网上很多总结的规则,但如果你懂“广度优先遍历”的算法,就应该很容易明白maven引入jar的机制。

对于maven项目来说,解决jar包冲突问题,就是为了解决jar包的依赖问题,以往我们通常都是手工将jar包放入classpath下,有可能因为项目需求,放入了多个不同版本的同名jar包,这时候解决冲突只能人为识别我们需要的是哪个版本,然后删除其他版本,而对于maven项目来说,依赖中可能存在多个版本的同名jar,但其引入机制决定最终只会引入一个,这时候我们要做的事情就是保证maven引入的jar是正确的那一个。

maven查看jar包依赖,可以通过命令mvn dependency:tree 获取所有的项目jar依赖树信息,当然我们可以方便的借助开发工具更直观感受到,这里以eclipse为例:

eclipse打开项目的pom.xml文件,我们先看下pom.xml中的几个dependency

jar包冲突解决思路_第1张图片

这几个依赖都涉及到了slf4j-api,我们从另一个视图中可以看到具体的依赖关系:

jar包冲突解决思路_第2张图片

在Filter框中搜索关键词,会在左边的框中看到slf4j-api的依赖树,我们看到这里有三个slf4j-api,但是版本不同,根据之前说的广度遍历原则,加载了1.7.16的版本,从右边的框中我们也能清晰的看到最终加载的版本。

同时看到,左边框中的依赖树顺序上跟我们pom.xml的文本顺序是保持一致的,所以当我们需要解决jar冲突,需要使用指定版本jar时,可以直接根据maven依赖的机制,在pom.xml里调整dependency顺序。

你可能感兴趣的:(java,maven,jar冲突)