目录
1、Maven中jar包冲突原因与最优解决方案
jar包冲突原因:当我们在maven项目中引入第三方组件时,三方组件中的依赖可能会与项目已有组件发生冲突。
A —》B —》C —》D1(log 15.0):A中包含对B的依赖,B中包含对C的依赖,C中包含对D1的依赖,假设是D1是日志jar包,version为15.0
E—》F—》D2(log 16.0):E中包含对F的依赖,F包含对D2的依赖,假设是D2是同一个日志jar包,version为16.0
解决方案:
1、Maven默认处理策略:最短路径优先、最先声明优先
最短路径优先:Maven 面对 D1 和 D2 时,会默认选择最短路径的那个 jar 包,即 D2。E—》F—》D2 比A —》B —》C —》D1路径短。
最先声明优先:如果路径一样的话,如: A—》B—》C1, E—》F—》C2 ,两个依赖路径长度都是 2,那么就选择最先声明。
2、排除依赖:用于排除某项依赖的依赖jar包
我们可以借助Maven Helper插件中的Dependency Analyzer分析冲突的jar包,然后在对应标红版本的jar包上面点击execlude,就可以将该jar包排除出去。
手动在pom.xml中使用<exclusion>
标签去排除冲突的jar包(上面利用插件Maven Helper中的execlude方法其实等同于方法1)
3、版本锁定:一般用在继承项目的父项目中,正常项目都是多模块的项目,如moduleA和moduleB共同依赖X这个依赖的话,那么可以将X抽取出来,同时设置其版本号,这样X依赖在升级的时候,不需要分别对moduleA和moduleB模块中的依赖X进行升级,避免太多地方引用X依赖的时候忘记升级造成jar包冲突。
4、maven-shade-plugin插件:保证不影响项目原有依赖版本的情况下正常使用三方组件。