Maven 的依赖冲突
Posted ys951207
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven 的依赖冲突相关的知识,希望对你有一定的参考价值。
1、什么是依赖传递
添加一个 struts2-core 的依赖,结果会发现所有关于 struts2 的依赖都会添加进来。
项目依赖 struts2-core-2.3.24.jar ,而 struts2-core-2.3.24.jar 会依赖 xwork-core-2.3.24.jar 等等。
所以这些 jar包 也都出现在我们的 maven工程 当中,这种现象就叫做依赖传递。
同理,我们依赖 service层 ,相关的依赖包也依赖传递了过来。
2、依赖冲突
Ⅰ、依赖冲突的产生
我们添加下面两个依赖:
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency>
我们发现这两个 jar包 同时依赖了 spring-beans
struts2-spring-plugin 依赖 spring-beans-3.0.5,spring-context 依赖 spring-beans-4.2.4,但是发现 spring-beans-3.0.5 加入到工程中,而我们希望 spring-beans-4.2.4 加入到工程中,这就造成了依赖冲突。
Ⅱ、解决依赖冲突的方法
方法一:依赖调解原则
maven 自动按照下边的原则调解:
①第一声名者优先原则
在 pom 文件定义依赖,以先声明的依赖为准。
例子:上面先依赖的 struts2-spring-plugin ,故加入到工程中的依赖为 spring-beans-3.0.5 。
②路径近者优先原则
例如:A 依赖 spring-beans-4.2.4 ,A 依赖 B,B 依赖 spring-beans-3.0.5,则 spring-beans-4.2.4 优先被依赖在 A 中。这是因为 spring-beans-4.2.4 相对 spring-beans-3.0.5 被 A 依赖的路径最近。
方法二:排除依赖
上边的问题也可以通过依赖排除解决。
例如:在 struts2-spring-plugin 的依赖中设置添加排除依赖,排除 spring-beans-3.0.5。
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24</version> <!-- 排除 spring-beans 的依赖 --> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> </exclusions> </dependency>
方法三:锁定版本(企业开发中常用)
面对众多的依赖,用 版本锁定 可以不用考虑依赖路径、声明优化等因素,可以采用直接锁定版本的方法缺点依赖构建的版本。
例如:下面锁定了 spring-beans 和 spring-context 的版本:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.ys</groupId> <artifactId>maven-project</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <!-- 属性 --> <properties> <spring.version>4.2.4.RELEASE</spring.version> <properties/> <!-- 锁定版本:spring版本为 4.2.4 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> </dependencies> </project>
注意:
在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果需要添加锁定版本的依赖,需要单独添加依赖。
在添加的依赖中不再需要指定版本了,因为上面已经锁定了版本。
以上是关于Maven 的依赖冲突的主要内容,如果未能解决你的问题,请参考以下文章
Maven01_05_compile和test依赖范围Maven的一些依赖情况依赖冲突如果出现冲突就会采取就近原则可选依赖(optional)排除依赖(exclusions)