依赖传递
当前项目引入了一个依赖,该依赖的依赖也会被引入项目。maven会解析直接依赖的POM,将那些必要的间接依赖,以传递依赖的形式引入到当前项目中,这种现象我们称为依赖传递。
依赖传递可能会引起jar包依赖冲突及循环依赖的问题。
依赖冲突解决
依赖调节原则
-
路径近者优先原则
按照jar包依赖的最短路径选择。当同时依赖于spring-contex和spring-webmvc时,都会传递过来 spring-beans,那如果直接把spring-beans的依赖直接写到pom文件中,那么项目就不会再使用其他依赖传递来的spring-beans,因为自己直接在pom中定义spring-beans要比其他依赖传递过来的路径要近。
-
第一声明者优先原则
在pom文件定义依赖,以先声明的依赖为准。
比如当A依赖C,B依赖于C,在pom中先定义A则导入的jar包版本即为A依赖于C的版本,若先定义B则导入的jar包版本为B依赖于C的版本。
排除依赖
比如在依赖zookeeper的设置中添加排除依赖,排除slf4j的依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.2</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
锁定版本
有一种方法不用考虑依赖路径、声明优先等因素,可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>