基本概念
依赖冲突:依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突
依赖冲突的范围:发生管理Jar包的框架,比如Maven和Gradle,这里以Maven为例子
依赖冲突发生的典型例子(主要原因):
依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会由Maven间接引入进来,从而造成类包冲突
依赖原则:
1.路径不同间接依赖中maven采用的是路径最短者优先
2.路径相同间接依赖中maven 采用的是依赖定义顺序从上到下
解决依赖冲突的方案
方法1:自己主管的处理好版本关系,Maven会从上到下,优先相同jar的最前面写的版本
好处:如果需要用下面的版本,直接将前面的删掉就行
不足:需要对项目的模式十分清楚,不然删错jar包会造成各类问题
方法2:最直接的方法就是找到冲突的jar,然后用exclusion标签将冲突,也就是不需要的jar给排除掉。
好处:最直接有效的方式解决依赖冲突
不足:如果jar非常多,比如企业级项目,需要花大量时间写代码以及思考依赖关系。所以这个方法实用但成本高。
方法3:单独为依赖库添加 dependency 指定版本
将打包好的jar全部拆开,然后按照需要自己重新导入这些jar包
比如srping-webmvc这个jar包,里面由一整套spring的mvc需要的依赖包,根据依赖关系和依赖注入的概念,我们可以将这个父jar包拆开一个一个导里面的子jar。
方法4:使用 dependencyManagement 锁定依赖库的版本号(推荐)
这种方式十分适合多模块编程,总的父项目去写所有的jar包括版面,然后通过modules标签将 子模块导入,子模块只需要导入jar名就行,而不用导入版本号,这样整个项目的jar都集中在父项目的pom文件去管理,子模块也不用担心依赖冲突,因为需要什么导什么但不管版本。
总结
依赖冲突是做项目中必须要注意的问题,否则整个项目会连运行都无法实现。个人推荐使用版本锁定的方法,dependencyManagement只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖。