持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
1.依赖排除
在maven中,依赖是有传递性的,依赖排除就是阻断这个传递性。 可能有同学会有疑问,我们为什么要阻断这种传递? 如果对传递依赖知识不是很清楚的同学可以参考这篇文章。
我们来看下图,A依赖于B和C,B依赖于D,C也依赖于D,但是B和C所依赖的D版本是不同的。如果这两个D不引发冲突那也就罢了,要是起了冲突,我们就需要来排除掉其中一个D。至于你想要那个D那就看自己的需要了。
新的问题来了,那就是如何排除掉D,让A只剩下一个D? 如果我们是想要留下D(2.0)这个版本的D,那么我们需要在A和B之间做一个依赖传递的阻断,让D(1.0)无法到达A。如下图所示。
注意:上图是阻断B所依赖的D传递到A,而不是A不去依赖B,A在阻断D(1.0)到它那里并不影响它继续依赖B。
各位同学,你们觉得A阻断了B所依赖的D(1.0)到它那里会不会影响B依赖D(1.0)? 答案是不会。B依然会依赖D(1.0)并不会跑去依赖D(2.0)。
2.排除依赖传递的方法
在引入的依赖里面使用exclusions标签进行依赖的阻断。看到这个标签名是复数,所以它是可以阻断多个依赖的,具体由exclusion标签来完成阻断的工作。在exclusion标签里面,只需写上要阻断的依赖的groupId和artifactId即可。
<dependency>
<groupId>B的groupid</groupId>
<artifactId>B的项目名</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
<!-- 使用excludes标签配置依赖的排除 -->
<exclusions>
<!-- 在exclude标签中配置一个具体的排除 -->
<exclusion>
<!-- 指定要排除的依赖的坐标(不需要写version) -->
<groupId>D的groupid</groupId>
<artifactId>D的项目名</artifactId>
</exclusion>
</exclusions>
</dependency>
3.验证
准备一个项目pro02-maven-web,让它依赖pro01-maven-java。pro01-maven-java依赖spring-core。spring-core会依赖commons-logging。
现在,我们来阻断commons-logging到达pro02-maven-web。我们需要做的就是在pro02-maven-web的pom文件做好响应的配置。配置如下所示:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- 配置对Java工程pro01-maven-java的依赖 -->
<!-- 具体的配置方式:在dependency标签内使用坐标实现依赖 -->
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<!--scope不写默认也是compile-->
<scope>compile</scope>
<!-- 使用excludes标签配置依赖的排除 -->
<exclusions>
<!-- 在exclude标签中配置一个具体的排除 -->
<exclusion>
<!-- 指定要排除的依赖的坐标(不需要写version) -->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
实验结果如下图所示: