一,出现的问题
在做一次自动化生成代码的测试中,引入了mybatis-gernerator这个jar包,在引入mysql-connector-java这个jar包时,
出现了一些jar包冲突的问题,问题如下
现在maven控制栏出现了两处错误,第一个错误是maven依赖冲突,第二个冲突是版本号不对,现在首先解决问题一,idea显示这个jar包有两个版本,一个是2.3.0,一个显示是2.1.2版本,
二,解决问题:
然后我找了一个插件,maven helper插件。安装方法如下:在idea中找到setting 按钮,在plugins 中引入,引入后界面如下:
切换到此视图即可进行相应操作:
- 1,Conflicts(查看冲突)
- 2,All Dependencies as List(列表形式查看所有依赖)
- 3,All Dependencies as Tree(树形式查看所有依赖)
切换到maven 依赖视图选择冲突选项,如果有冲突,在左下面区域会有红色显示。右键单击红色区域,弹出菜单选择Exclude命令,对冲突进行排除。
三,maven依赖产生冲突原因
- 如果项目的依赖A和依赖B同时引入了依赖C。
- 如果依赖C在A和B中的版本不一致就可能依赖冲突。
- 比如 项目 1.0),B 1.1)。
- 那么maven如果选择高版本C(
1.1
)来导入(这个选择maven会根据不等路径短路径原则和同等路径第一声明原则选取),C(1.0
)中的类c在C(1.1
)中被修改而不存在了。 - 在编译期可能并不会报错,因为编译的目的只是把业务源代码编译成class文件,所以如果项目源代码中没有引入共有依赖C因升级而缺失的类c,就不会出现编译失败。除非源代码就引入了共有依赖C因升级而缺失的类c则会直接编译失败。
- 在运行期,很有可能出现依赖A在执行过程中调用C(
1.0
)以前有但是升级到C(1.1
)就缺失的类c,导致运行期失败,出现很典型的依赖冲突时的NoClassDefFoundError
错误。 - 如果是升级后出现原有的方法被修改而不存在的情况时,就会抛出
NoSuchMethodError
错误。
四,maven仲裁机制:
- 优先按照依赖管理元素中指定的版本声明进行仲裁,此时下面的两个原则都无效了
- 若无版本声明,则按照“短路径优先”的原则(Maven2.0)进行仲裁,即选择依赖树中路径最短的版本
- 若路径长度一致,则按照“第一声明优先”的原则进行仲裁,即选择POM中最先声明的版本