Maven排除依赖和可选依赖

news/2024/12/29 12:57:21/

我们知道 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 元素及排除依赖说明如下:

  • 排除依赖是控制当前项目是否使用其直接依赖传递下来的接间依赖;
  • exclusions 元素下可以包含若干个 exclusion 子元素,用于排除若干个间接依赖;
  • exclusion 元素用来设置具体排除的间接依赖,该元素包含两个子元素:groupId 和 artifactId,用来确定需要排除的间接依赖的坐标信息;
  • exclusion 元素中只需要设置 groupId 和 artifactId 就可以确定需要排除的依赖,无需指定版本 version。

可选依赖

与上文的应用场景相同,也是 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 元素及可选依赖说明如下:

  • 可选依赖用来控制当前依赖是否向下传递成为间接依赖;
  • optional 默认值为 false,表示可以向下传递称为间接依赖;
  • 若 optional 元素取值为 true,则表示当前依赖不能向下传递成为间接依赖。

排除依赖 VS 可选依赖 

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

  • 排除依赖是控制当前项目是否使用其直接依赖传递下来的接间依赖;
  • 可选依赖是控制当前项目的依赖是否向下传递;
  • 可选依赖的优先级高于排除依赖;
  • 若对于同一个间接依赖同时使用排除依赖和可选依赖进行设置,那么可选依赖的取值必须为 false,否则排除依赖无法生效。

http://www.ppmy.cn/news/220390.html

相关文章

证明正定矩阵的充要条件:全部顺序主子式大于0

定理&#xff1a; f x T A x f x^TAx fxTAx 正定的充要条件是 A A A 的全部顺序主子式大于零。 必要性&#xff1a;即 f x T A x f x^TAx fxTAx 正定 ⇒ \Rightarrow ⇒ A A A 的全部顺序主子式大于零。 首先&#xff0c;由于 f x T A x f x^TAx fxTAx 正定&…

罗技m330更换接收器(通过重新对码的方式)

下载安装SetPoint驱动&#xff1a;https://support.logi.com/hc/zh-cn/articles/360025141274 在罗技setpoint驱动的安装目录里找到Connectutility.exe 将鼠标的开关关闭&#xff0c;再打开&#xff0c;完成配对。 本文方法来源&#xff1a; 无线鼠标更换接收器后怎样才能使用…

制造业在数字化时代如何应对挑战和机遇?

随着数字化时代的到来&#xff0c;制造业不可避免地会受到一些对应的挑战和机遇。以下是一些关键部分&#xff1a; 数字化转型&#xff1a;制造商已经采用数字技术来转变他们的运营。包括采用高级分析、自动化、人工智能 (AI) 和物联网 (IoT)。这些技术可以提高生产力、质量控制…

一文了解四层协议:TCP/IP

TCP/IP 协议是计算机网络中最重要的协议之一&#xff0c;它被广泛应用于互联网、局域网和广域网等各种网络环境。TCP/IP 协议栈包括四个层次&#xff0c;这四个层次分别是&#xff1a;应用层、传输层、网络层和数据链路层&#xff0c;这四层协议构成了 TCP/IP 协议栈。本文将详…

高完整性系统(4)Formal Logic (形式逻辑和 Alloy 简介)

文章目录 Story so far形式逻辑命题 proposition谓词 predicate连接词VariablesSet 集合Set operation 集合操作Set Relationship 集合关系Alloy Set alloy 的集合表示Quantification 量词Relations 关系案例Binary Relations 二元关系图Functions 函数Total v.s. Partial Func…

​LeetCode解法汇总2460. 对数组执行操作

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你一个下标从 0 开始的数组 nums &#xff0c;数组大小为 n &#xff0c;且由…

如何从消失的异常堆栈定位线上问题

一、消失的异常堆栈 如何快速定位问题&#xff1f;想必大家心中都有自己的答案&#xff0c;当然最简单直接的办法还是查找异常堆栈信息。 然而有时异常堆栈并不完整&#xff0c;只有一句描述&#xff0c;如下&#xff1a; Caused by: java.lang.NullPointerException 造成这…

第17节:cesium 图元聚合基础教程(含源码+视频)

相关代码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><vc-layer-imagery><vc-pr