1 依赖版本冲突
当我们在pom.xml文件中添加了spring-context以及struts-spring-plugin的依赖后,这时会出现其他的jar包,称之为依赖传递,而添加不同的依赖后,可能会产生版本的冲突,如下所示:
2 四个原则
2.1 第一声明者优先原则
在pom.xml文件中定义依赖,以首先定义的依赖为基准
比如当我们同时定义了spring-bean的两个版本,那么首先定义的4.2.4版本将成为依赖的基准
<dependencies>
<!-- spring-beans-4.2.4 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- spring-beans-3.0.5 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
</dependency>
</dependencies>
2.2 路径近者优先原则
也就是说当我们在pom.xml文件中单独添加了spring-bean的依赖,而struts-spring-plugin依赖于spring-bean,struts-spring-plugin与我们单独所定义的spring-bean是同级的,因此会以单独定义的bean依赖为基准。(也就是自己添加的jar包)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
2.3 排除依赖原则
比如在添加struts-spring-plugin约束时,排除spring-bean,如下所示:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>
2.4 版本锁定原则
面对众多的依赖,版本锁定这一种方式不需要考虑依赖的路径、声明优化等因素,可以直接锁定所依赖jar包的版本,锁定后不会考虑声明顺序及路径。下面以锁定Struts2、Spring、Hibernate版本为例:
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<hibernate.version>5.0.7.Final</hibernate.version>
<struts.version>2.3.24</struts.version>
</properties>
<!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
</dependencies>
</dependencyManagement>