出现以上错误,大多数情况都是包的版本冲突导致的。
像上图,就发生了包引用冲突,如果C包v0.1版本在前,JVM加载过v0.1版本里的同名类后就不会加载v0.2里的同名类,这很可能造成丢失了v0.2里同类里新增的方法属性等等。
接下来我们看看Maven对这种情况是如何进行管理的。
Maven 对 pom 文件的传递性依赖自动进行管理, 其中有一个原则 绝对不允许最终的classpath出现同名不同版本的jar包 。
Maven会根据pom文件中的groupId、artifactId、version来判断jar是否冲突,这就是规范约定的好处之一。
如果出现了同名不同版本的jar包,Maven的处理原则是 离你项目更近的jar包会被选中,其他的淘汰 , 这句话什么意思呢 请看下图:
C包V0.2胜出,因为它离我们的项目更近,看图应该就感觉很直观啦,
最终的classpath就是 A包、B包、D包、C包v0.2, Maven将C包v0.1排除掉啦。
File–>setting—>Plugins—>在搜索框中填写Maven Helper然后搜索,单击Install按钮进行安装,装完重启IDE。
当Maven Helper 插件安装成功后,打开项目中的pom文件,下面就会多出一个视图Dependency Analyzer:
切换到此试图即可进行相应操作:
当前界面上还提供搜索功能,方便使用。
切换到maven 依赖视图选择冲突选项,如果有冲突,在左下面区域会有红色显示。
方法1:更换兼容版本
方法2:右键单击红色区域,弹出菜单选择Exclude命令,对冲突进行排除。