Maven 当中实现:依赖的排除

文章介绍了Maven中排除依赖的概念,即当一个模块A依赖于B,B又依赖于C时,如果不想让C传递给A,可以在A的配置中排除C。通过提供示例展示了如何在pro02-maven-web的pom.xml中排除pro01-maven-java传递过来的commons-logging依赖,以及通过mvndependency:tree命令验证排除操作成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依赖的排除

1. 概念

当 A 依赖 B,B 依赖 C 而且 C 可以传递到 A 的时候,A 不想要 C,需要在 A 里面把 C 排除掉。而往往这种情况都是为了避免 jar 包之间的冲突。

在这里插入图片描述

所以配置依赖的排除其实就是阻止某些 jar 包的传递。因为这样的 jar 包传递过来会和其他 jar 包冲突。

在这里插入图片描述

背景:我们将 pro02-mavne-web 当中的对 pro01-maven-java依赖的spring-core当中依赖传递过来的 commons-logging去了。如下图所示:

如下是:pro1-maven-java的 pom.xml 配置:

<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>com.rainbowSea.maven</groupId>
  <artifactId>pro01-maven-java</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>pro01-maven-java</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
  <!--测试 test 不能传递依赖-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

	<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
	<dependency>
	  <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.0.0.RELEASE</version>
	</dependency>


<!--测试 provided 不能传递依赖-->
	<dependency>
	 <groupId>javax.servlet</groupId>
	 <artifactId>javax.servlet-api</artifactId>
     <version>3.1.0</version>
	 <scope>provided</scope>
</dependency>
  </dependencies>
</project>

在这里插入图片描述

2. 配置方式

对于 pro02-maven-web 的pom.xml 配置,移除 :pro01-maven-java依赖传递过来的commons-logging的jar包

注意是:在你导入 pro01-maven-java的标签下面配置的,不是在其他的位置配置的,因为你要排除的是 pro01-maven-java 存在的依赖传递所以要在pro01-mavne-java的标签下配置 的排除依赖。
在这里插入图片描述

<!--导入的是对pro01-maven-java 中的封装的 jar的依赖-->
	<dependency>
	<!--通过指定被依赖工程的坐标完成依赖-->
	  <groupId>com.rainbowSea.maven</groupId>
      <artifactId>pro01-maven-java</artifactId>
      <version>1.0-SNAPSHOT</version>
	  <!--生命周期的范围-->
	  <scope>compile</scope>
      
      
       <!-- 使用excludes标签,配置依赖的排除  -->
     <exclusions>
       <!-- 在exclude标签中配置一个具体的排除 -->
       <exclusion>
        <!-- 指定要排除的依赖的坐标(不需要写version)只需要写:groupId和artifatId就可以了, -->
	    <!--这里我要排除的是 在 pro02-maven-web当中存在的依赖传递的: commons-logging-->
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
       </exclusion>
     </exclusions>
	</dependency>

pro02-maven-web的 pom.xml 完整信息:

<?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>com.rainbowSea.maven</groupId>
  <artifactId>pro02-maven-web</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>pro02-maven-web Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

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

<!--导入的是对pro01-maven-java 中的封装的 jar的依赖-->
	<dependency>
	<!--通过指定被依赖工程的坐标完成依赖-->
	  <groupId>com.rainbowSea.maven</groupId>
      <artifactId>pro01-maven-java</artifactId>
      <version>1.0-SNAPSHOT</version>
	  <!--生命周期的范围-->
	  <scope>compile</scope>
      
      
       <!-- 使用excludes标签,配置依赖的排除  -->
     <exclusions>
       <!-- 在exclude标签中配置一个具体的排除 -->
       <exclusion>
        <!-- 指定要排除的依赖的坐标(不需要写version)只需要写:groupId和artifatId就可以了, -->
	    <!--这里我要排除的是 在 pro02-maven-web当中存在的依赖传递的: commons-logging-->
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
       </exclusion>
     </exclusions>
	</dependency>
  </dependencies>

  <build>
    <finalName>pro02-maven-web</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

3. 测试

测试的方式:在 pro02-maven-web 工程中配置对 commons-logging 的排除

<dependency>
  <groupId>com.rainbowSea.maven</groupId>
  <artifactId>pro01-maven-java</artifactId>
  <version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
  <!-- 使用excludes标签配置依赖的排除  -->
  <exclusions>
    <!-- 在exclude标签中配置一个具体的排除 -->
    <exclusion>
      <!-- 指定要排除的依赖的坐标(不需要写version) -->
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>

运行 mvn dependency:tree 命令查看效果:

在这里插入图片描述

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ pro02-maven-web ---
[INFO] com.rainbowSea.maven:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.11:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] \- com.rainbowSea.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO]    \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO] ------------------------------------------------------------------------

发现在 spring-core 下面就没有 commons-logging 了。

我们在查看:pro01-maven-java当中的依赖,是没有任何影响的,还是原来的样子。

在这里插入图片描述

4. 最后:感谢

该文章参考了,如下博主的分享。我们再此,真诚的感谢博主的技术的热情的分享。

⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐感谢如下博主的分享 ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

【1】:兵器|代码重工

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值