Maven03_依赖和依赖冲突解决
1、传递依赖
比如添加SpringMVC的核心依赖坐标
会发现项目中还出现了spring-webmvc以外的其他jar包。因为我们的项目依赖了spring-webmvc,但是spring-webmvc又依赖了sping-beans.jar等,所以spring-webmvc的依赖包也自动进入了个人项目中。
这种现象就称为传递依赖。
它们的依赖关系图如下:
2、依赖冲突解决方案
1)问题分析
如果在项目中继续添加一个依赖,会发现这两个jar包都依赖了spring-beans,但是两个jar包依赖的版本明显不一致。观察项目传递进来的jar包,发现spring-beans版本是4.2.4,但是我们希望的版本是5.0.2,这就造成了依赖冲突
2)依赖的调解原则
maven自动按照以下原则进行调解:
① 第一声明者优先原则
在pom文件定义的依赖,相同jar包会根据先声明的版本为准
测试:将上面的spring-webmvc和spring-context位置互换,会发现系统导入的spring-beans版本是5.0.2
分析:
因为spring-context的位置放在了前面,所以依赖传递的jar包版本根据声明的优先原则变为了5.0.2
② 路径近者优先原则
例如:还是上述情况,spring-contex 和 spring-webmvc 都会传递过来 spirng-beans,那如果直接把 spring-beans 的依赖直接写到 pom 文件中,
那么项目就不会再使用其他依赖传 递来的 spring-beans,因为自己直接在 pom 中定义 spring-beans 要比其他依赖传递过来的路径要近。
在本工程中的 pom 中加入 spirng-beans-5.0.2 的依赖,根据路径近者优先原则,系统将导入 spirng-beans-5.0.2:
3)排除依赖
上边的问题也可以通过排除依赖方法辅助依赖调解,
如下: 比如在依赖 spring-webmvc 的设置中添加排除依赖,排除 spring-beans, 下边的配置表示:依赖 spring-webmvc,但排除 spring-webmvc 所依赖的 spring-beans。
4)锁定版本
面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素。可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,
以锁定的版本的为准添加到工程中,此方法在企业开发中常用。 如下的配置是锁定了 spring-beans 和 spring-context 的版本:
5)提取版本号
还可以把版本号提取出来,使用<properties>标签设置成变量
注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加标签<dependencies></dependencies>,如下:
上边添加的依赖并没有指定版本,原因是已在<denpendencyManagement>中锁定了版本, 所以在<dependency>下不需要再指定版本。