赞
踩
我们知道 Maven 依赖具有传递性,例如 A 依赖于 B,B 依赖于 C,在不考虑依赖范围等因素的情况下,Maven 会根据依赖传递机制,将间接依赖 C 引入到 A 中。但如果 A 出于某种原因,希望将间接依赖 C 排除,那该怎么办呢?Maven 为用户提供了两种解决方式:排除依赖(Dependency Exclusions)和可选依赖(Optional Dependencies)。
假设存在这样的依赖关系,A 依赖于 B,B 依赖于 X,B 又依赖于 Y。B 实现了两个特性,其中一个特性依赖于 X,另一个特性依赖于 Y,且两个特性是互斥的关系,用户无法同时使用两个特性,所以 A 需要排除 X,此时就可以在 A 中将间接依赖 X 排除。
排除依赖是通过在 A 中使用 exclusions 元素实现的,该元素下可以包含若干个 exclusion 子元素,用于排除若干个间接依赖,示例代码如下。
- <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>net.biancheng.www</groupId>
- <artifactId>A</artifactId>
- <version>1.0-SNAPSHOT</version>
- <dependencies>
- <dependency>
- <groupId>net.biancheng.www</groupId>
- <artifactId>B</artifactId>
- <version>1.0-SNAPSHOT</version>
- <exclusions>
- <!-- 设置排除 -->
- <!-- 排除依赖必须基于直接依赖中的间接依赖设置为可以依赖为 false -->
- <!-- 设置当前依赖中是否使用间接依赖 -->
- <exclusion>
- <!--设置具体排除-->
- <groupId>net.biancheng.www</groupId>
- <artifactId>X</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- </dependencies>
- </project>
关于 exclusions 元素及排除依赖说明如下:
与上文的应用场景相同,也是 A 希望排除间接依赖 X,我们还可以在 B 中将 X 设置为可选依赖。
设置可选依赖
在 B 的 POM 关于 X 的依赖声明中使用 optional 元素,将其设置成可选依赖,示例配置如下。
- <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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>net.biancheng.www</groupId>
- <artifactId>B</artifactId>
- <packaging>jar</packaging>
- <version>1.0-SNAPSHOT</version>
- <dependencies>
- <dependency>
- <groupId>net.biancheng.www</groupId>
- <artifactId>X</artifactId>
- <version>1.0-SNAPSHOT</version>
- <!--设置可选依赖 -->
- <optional>true</optional>
- </dependency>
- </dependencies>
- </project>
关于 optional 元素及可选依赖说明如下:
排除依赖和可选依赖都能在项目中将间接依赖排除在外,但两者实现机制却完全不一样。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。