zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Maven排除依赖和可选依赖

Maven依赖 排除 可选
2023-06-13 09:11:54 时间
我们知道 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 元素及排除依赖说明如下:


exclusion 元素用来设置具体排除的间接依赖,该元素包含两个子元素:groupId 和 artifactId,用来确定需要排除的间接依赖的坐标信息; exclusion 元素中只需要设置 groupId 和 artifactId 就可以确定需要排除的依赖,无需指定版本 version。

与上文的应用场景相同,也是 A 希望排除间接依赖 X,除了在 B 中设置可选依赖外,我们还可以在 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 元素及可选依赖说明如下:


排除依赖 VS 可选依赖 

排除依赖和可选依赖都能在项目中将间接依赖排除在外,但两者实现机制却完全不一样。


若对于同一个间接依赖同时使用排除依赖和可选依赖进行设置,那么可选依赖的取值必须为 false,否则排除依赖无法生效。