先添加 springmvc 的核心依赖的坐标
会发现出现除了 spring-webmvc
以外的其他 jar。因为我们的项目依赖 spring-webmv.jar
,而spring-webmv.jar
会依赖 spring-beans.jar
等等,所以 spring-beans.jar
这些 jar 包也出现在了我们的 maven 工程中,这种现象我们称为依赖传递。从下图中可看到他们的关系:(请注意spring-beans
的版本)
接着添加一个依赖
我们会发现这两个 jar 包同时都依赖了 spring-beans
但是spring-webmvc
依赖 spirng-beans-4.2.4
,spring-context
依赖 spring-beans-5.0.2
,但是发现spirng-beans-4.2.4
加入到工程中
而我们希望 spring-beans-5.0.2
加入工程。这就造成了依赖冲突。解决依赖冲突有以下原则:
maven 自动按照下边的原则调解:
测试:
如果将上边 spring-webmvc
和 spring-context
顺序颠倒,系统将导入 spring-beans-5.0.2
。
分析:
由于 spring-webmvc
在前边以 spring-webmvc
依赖的 spring-beans-5.0.2
为准,所以最终spring-beans-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
:
上边的问题也可以通过排除依赖方法辅助依赖调解,如下:比如在依赖 spring-webmvc
的设置中添加排除依赖,排除 spring-beans
,下边的配置表示:依赖 spring-webmvc
,但排除 spring-webmvc
所依赖的 spring-beans
。
面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。如下的配置是锁定了 spring-beans
和 spring-context
的版本:
还可以把版本号提取出来,使用标签设置成变量。
注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加
<dependencies></dependencies>
标签,如下:
上边添加的依赖并没有指定版本,原因是已在<dependencyManagement>
中锁定了版本,所以在<dependency>
下不需要再指定版本。