1、传递依赖

  比如添加SpringMVC的核心依赖坐标

  

spring jar 依赖优化 spring依赖冲突_spring jar 依赖优化

 

 

   会发现项目中还出现了spring-webmvc以外的其他jar包。因为我们的项目依赖了spring-webmvc,但是spring-webmvc又依赖了sping-beans.jar等,所以spring-webmvc的依赖包也自动进入了个人项目中。

  这种现象就称为传递依赖。

  它们的依赖关系图如下:

  

spring jar 依赖优化 spring依赖冲突_jar包_02

 

 

 2、依赖冲突解决方案

  1)问题分析

    如果在项目中继续添加一个依赖,会发现这两个jar包都依赖了spring-beans,但是两个jar包依赖的版本明显不一致。观察项目传递进来的jar包,发现spring-beans版本是4.2.4,但是我们希望的版本是5.0.2,这就造成了依赖冲突

    

spring jar 依赖优化 spring依赖冲突_jar包_03

 

   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:

      

spring jar 依赖优化 spring依赖冲突_jar包_04

 

  3)排除依赖

    上边的问题也可以通过排除依赖方法辅助依赖调解,

    如下: 比如在依赖 spring-webmvc 的设置中添加排除依赖,排除 spring-beans, 下边的配置表示:依赖 spring-webmvc,但排除 spring-webmvc 所依赖的 spring-beans。

    

spring jar 依赖优化 spring依赖冲突_spring_05

 

   4)锁定版本

    面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素。可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,

  以锁定的版本的为准添加到工程中,此方法在企业开发中常用。 如下的配置是锁定了 spring-beans 和 spring-context 的版本:

    

spring jar 依赖优化 spring依赖冲突_mvc_06

 

   5)提取版本号

    还可以把版本号提取出来,使用<properties>标签设置成变量

    

spring jar 依赖优化 spring依赖冲突_jar包_07

 

     注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加标签<dependencies></dependencies>,如下:

    

spring jar 依赖优化 spring依赖冲突_jar包_08

 

     上边添加的依赖并没有指定版本,原因是已在<denpendencyManagement>中锁定了版本, 所以在<dependency>下不需要再指定版本。