23、Maven Helper解决依赖冲突

发布时间 2023-09-25 17:17:50作者: 爱文(Iven)

一、Jar包冲突的通常表现:

Jar包冲突往往是很诡异的事情,也很难排查,但也会有一些共性的表现。

1、抛出java.lang.ClassNotFoundException:典型异常,主要是依赖中没有该类。导致原因有两方面:

(1)、第一,的确没有引入该类;

(2)、第二,由于Jar包冲突,Maven仲裁机制选择了错误的版本,导致加载的Jar包中没有该类。

2、抛出java.lang.NoSuchMethodError:找不到特定的方法。Jar包冲突,导致选择了错误的依赖版本,该依赖版本中的类对不存在该方法,或该方法已经被升级。

3、抛出java.lang.NoClassDefFoundError,java.lang.LinkageError等,原因同上。

没有异常但预期结果不同:加载了错误的版本,不同的版本底层实现不同,导致预期结果不一致。

 

二、Jar包冲突的本质:

Jar包冲突的本质:Java应用程序因某种因素,加载不到正确的类而导致其行为跟预期不一致。

具体分两种情况:

1、情况一:项目依赖了同一Jar包的多个版本,并且选错了版本;

同一个依赖引入了多个Jar包版本,不同的Jar包版本有不同的类和方法。由于Maven依赖树的仲裁机制导致Maven加载了错误的Jar包,从而导致Jar包冲突

2、情况二:同样的类在不同的Jar包中出现,导致JVM加载了错误的类;

同一类在不同的Jar包中出现。这种情况是由于JVM的同一个类加载器对于同一个类只会加载一次,现在加载一个类之后,同全限定名的类便不会进行加载,从而出现Jar包冲突的问题

针对第二种情况,如果不是类冲突抛出了异常,你可能根本意识不到,所以就显得更为棘手。这种情况就可以采用前文所述的通过分析不同类加载器的优先级及加载路径、文件系统的文件加载顺序等进行调整来解决。

 

三、Maven Helper插件解决Jar包依赖冲突:

1、安装Maven Helper插件:

 2、查看依赖冲突:

 3、解决冲突:

 

四、参考:

Maven依赖冲突解决总结