一,出现的问题

      在做一次自动化生成代码的测试中,引入了mybatis-gernerator这个jar包,在引入mysql-connector-java这个jar包时,

maven排除某个module maven排除依赖包的子依赖_查看maven版本

出现了一些jar包冲突的问题,问题如下

maven排除某个module maven排除依赖包的子依赖_程序运行依赖的重要文件版本不对_02

现在maven控制栏出现了两处错误,第一个错误是maven依赖冲突,第二个冲突是版本号不对,现在首先解决问题一,idea显示这个jar包有两个版本,一个是2.3.0,一个显示是2.1.2版本,                                                        

二,解决问题:                                                                                         

      然后我找了一个插件,maven  helper插件。安装方法如下:在idea中找到setting 按钮,在plugins 中引入,引入后界面如下:                                

maven排除某个module maven排除依赖包的子依赖_maven排除依赖包的子依赖_03

maven排除某个module maven排除依赖包的子依赖_程序运行依赖的重要文件版本不对_04

切换到此视图即可进行相应操作:

  1. 1,Conflicts(查看冲突)
  2. 2,All Dependencies as List(列表形式查看所有依赖)
  3. 3,All Dependencies as Tree(树形式查看所有依赖)           

切换到maven 依赖视图选择冲突选项,如果有冲突,在左下面区域会有红色显示。右键单击红色区域,弹出菜单选择Exclude命令,对冲突进行排除。

maven排除某个module maven排除依赖包的子依赖_程序运行依赖的重要文件版本不对_05

三,maven依赖产生冲突原因

  1. 如果项目的依赖A和依赖B同时引入了依赖C。
  2. 如果依赖C在A和B中的版本不一致就可能依赖冲突。
  3. 比如 项目 1.0),B 1.1)。
  4. 那么maven如果选择高版本C(1.1)来导入(这个选择maven会根据不等路径短路径原则和同等路径第一声明原则选取),C(1.0)中的类c在C(1.1)中被修改而不存在了。
  5. 在编译期可能并不会报错,因为编译的目的只是把业务源代码编译成class文件,所以如果项目源代码中没有引入共有依赖C因升级而缺失的类c,就不会出现编译失败。除非源代码就引入了共有依赖C因升级而缺失的类c则会直接编译失败。
  6. 在运行期,很有可能出现依赖A在执行过程中调用C(1.0)以前有但是升级到C(1.1)就缺失的类c,导致运行期失败,出现很典型的依赖冲突时的NoClassDefFoundError错误。
  7. 如果是升级后出现原有的方法被修改而不存在的情况时,就会抛出NoSuchMethodError错误。

四,maven仲裁机制

  • 优先按照依赖管理元素中指定的版本声明进行仲裁,此时下面的两个原则都无效了
  • 若无版本声明,则按照“短路径优先”的原则(Maven2.0)进行仲裁,即选择依赖树中路径最短的版本
  • 若路径长度一致,则按照“第一声明优先”的原则进行仲裁,即选择POM中最先声明的版本