maven依赖的排除

1,073 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

1.依赖排除

在maven中,依赖是有传递性的,依赖排除就是阻断这个传递性。 可能有同学会有疑问,我们为什么要阻断这种传递? 如果对传递依赖知识不是很清楚的同学可以参考这篇文章

我们来看下图,A依赖于B和C,B依赖于D,C也依赖于D,但是B和C所依赖的D版本是不同的。如果这两个D不引发冲突那也就罢了,要是起了冲突,我们就需要来排除掉其中一个D。至于你想要那个D那就看自己的需要了。

image.png 新的问题来了,那就是如何排除掉D,让A只剩下一个D? 如果我们是想要留下D(2.0)这个版本的D,那么我们需要在A和B之间做一个依赖传递的阻断,让D(1.0)无法到达A。如下图所示。

image.png 注意:上图是阻断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标签里面,只需写上要阻断的依赖的groupIdartifactId即可。

<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。

image.png 现在,我们来阻断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>

实验结果如下图所示:

image.png