A->B->C->test1.jar:A中包含对B的依赖,B中包含对C的依赖,C中包含对test1的依赖版本为1.0
D->E->F->test2.jar:F中依赖版本为2.0 当我们在调用F中test2中的方法,而c中是1.0版本,可能没有这个方法,这样JVM在加载A中test1依赖的时候,找不到方法,就会报NoSuchMethodError的错误,此时就产生了jar包冲突。我们可以使用Maven helper插件来查看我们的依赖:
Maven 解析 pom.xml 文件时,同一个 jar 包只会保留一个,那么面对多个版本的jar包,需要怎么解决呢?
2.1 默认出来方法 1.最短路径优先:
Maven 面对 D1 和 D2 时,会默认选择最短路径的那个 jar 包,即 D2。E->F->D2 比 A->B->C->D1 路径短 1。
2.最先声明优先
如果路径一样的话,如: A->B->C1, E->F->C2 ,两个依赖路径长度都是 2,那么就选择最先声明。
移除依赖:用于排除某项依赖的依赖jar包 (1)我们可以借助Maven Helper插件中的Dependency Analyzer分析冲突的jar包,然后在对应标红版本的jar包上面点击execlude,就可以将该jar包排除出去
3.版本锁定原则:一般用在继承项目的父项目中
正常项目都是多模块的项目,如moduleA和moduleB共同依赖X这个依赖的话,那么可以将X抽取出来,同时设置其版本号,这样X依赖在升级的时候,不需要分别对moduleA和moduleB模块中的依赖X进行升级,避免太多地方(moduleC、moduleD….)引用X依赖的时候忘记升级造成jar包冲突,这也是实际项目开发中比较常见的方法。