【Maven篇】解锁 Maven 的智慧:依赖冲突纷争下的版本调停者

在这里插入图片描述

缘起

软件开发世界是一个充满无限可能的领域,但同时也伴随着诸多挑战。其中之一,就是依赖冲突的问题。在这篇文章中,我们将揭开 Maven 这位“版本调停者”的神秘面纱,深入探讨如何在版本纠纷的盛宴中解决依赖问题。

Maven:版本的裁判

Maven,就像是项目的裁判,负责处理各种依赖版本之间的纠纷。它的策略既有技巧,又充满智慧,确保项目能够顺利运行,而不被版本的纷争所困扰。

依赖声明:引子

在 Maven 的舞台上,一切从依赖声明开始。通过在项目的 pom.xml 文件中声明依赖,我们告诉 Maven 项目需要哪些库以及它们的版本。下面是一个简单的例子:

<!-- pom.xml --><dependencies><dependency><groupId>org.example</groupId><artifactId>library-a</artifactId><version>1.0.0</version></dependency><dependency><groupId>org.example</groupId><artifactId>library-b</artifactId><version>2.0.0</version></dependency>
</dependencies>

在这个例子中,我们引入了两个库:library-a 版本为 1.0.0library-b 版本为 2.0.0

依赖范围:规则的指引

Maven 还引入了依赖范围的概念,这就是规则的指引。通过合理设置依赖范围,我们可以更好地控制每个库的使用场景,避免不必要的冲突。

  • compile:默认范围,对于所有阶段都有效,包括编译、测试、运行等。
  • provided:在编译和测试阶段有效,但在运行时由 JDK 或容器提供。
  • runtime:在运行和测试阶段有效,但在编译时不需要。
  • test:仅在测试阶段有效,不会被传递到运行阶段。

理解这些范围,就像是学习项目中不同角色的职责一样,每个库都有它在项目中的“工作范围”。

Maven 的解决之道

在项目中,不同模块可能对同一个库有不同的版本需求。这就是依赖冲突的问题。而 Maven 通过一系列规则和算法来解决这个问题。接下来让我们逐一深入了解这些策略。

1. 最短路径优先原则

这个原则基于最短路径的概念。Maven 在构建项目的依赖树时,会选择离项目最近的依赖。最短路径即最直接的路径,这样可以确保使用的是最近的版本。例如:

<!-- Module A pom.xml --><dependency><groupId>org.example</groupId><artifactId>library-x</artifactId><version>1.0.0</version>
</dependency>
<!-- Module B pom.xml --><dependency><groupId>org.example</groupId><artifactId>library-x</artifactId><version>2.0.0</version>
</dependency>

如果 Module A 和 Module B 同时引入了 library-x,Maven 会选择使用 Module B 中声明的版本(2.0.0),因为它离项目更近。

2. 最先声明优先原则

这个原则强调的是先声明的依赖更优先。当同一个库被多个模块引入时,Maven 会选择最先声明该库的模块中所声明的版本。例如:

<!-- Module A pom.xml --><dependency><groupId>org.example</groupId><artifactId>library-x</artifactId><version>1.0.0</version>
</dependency>
<!-- Module B pom.xml --><dependency><groupId>org.example</groupId><artifactId>library-x</artifactId><version>2.0.0</version>
</dependency>

如果 Module A 先声明了 library-x,那么 Maven 会选择使用 Module A 中声明的版本(1.0.0)。

3. 传递性依赖原则

这个原则涉及到依赖的传递性。如果一个库被多个依赖传递引入,Maven 会选择其中一个版本。这通常遵循前述的最短路径优先原则。例如:

<!-- Module A pom.xml --><dependency><groupId>org.example</groupId><artifactId>library-x</artifactId><version>1.0.0</version>
</dependency>
<!-- Module B pom.xml --><dependency><groupId>org.example</groupId><artifactId>library-y</artifactId><version>1.0.0</version>
</dependency>
<!-- Module C pom.xml --><dependency><groupId>org.example</groupId><artifactId>library-y</artifactId><version>2.0.0</version>
</dependency>

如果 Module A 和 Module B 同时引入了 library-y,而 Module B 又引入了 library-x,Maven 会选择 library-y 的最短路径,通常是 Module B 中声明的版本(1.0.0)。

4. 排除传递性依赖

有时,我们希望在某个模块中排除某个传递性依赖,以解决冲突。这可以通过在 pom.xml 文件中使用 <exclusions> 元素来实现。例如:

<!-- Module A pom.xml --><dependency><groupId>org.example</groupId><artifactId>library-y</artifactId><version>1.0.0</version><exclusions><exclusion><groupId>org.example</groupId><artifactId>library-x</artifactId></exclusion></exclusions>
</dependency>

通过这种方式,我们排除了对 library-x 的传递性依赖,确保 Module A 不受到 Module B 中对 library-x 的影响。

实战演练

让我们通过一个简单的实战演练,更加直观地感受 Maven 在解决依赖冲突中的智慧。考虑以下场景:

<!-- Module A pom.xml --><dependency><groupId>org.example</groupId><artifactId>library-x</artifactId><version>1.0.0</version>
</dependency>
<!-- Module B pom.xml --><dependency><groupId>org.example</groupId><artifactId>library-x</artifactId><version>2.0.0</version>
</dependency>
<!-- Module C pom.xml --><dependency><groupId>org.example</groupId><artifactId>library-y</artifactId><version>1.0.0</version>
</dependency>
<!-- Module D pom.xml --><dependency><groupId>org.example</groupId><artifactId>library-y</artifactId><version>2.0.0</version>
</dependency>

在这个例子中,Module A 和 Module B 引入了相同的库 library-x 不同版本,而 Module C 和 Module D 引入了相同的库 library-y 不同版本。接下来,我们构建项目,观察 Maven 是如何处理这些依赖冲突的。

mvn clean install

Maven 会根据前述的解决策略来决定最终使用的版本。在这个例子中,由于 Module B 离项目更近,Maven 可能会选择使用 Module B 中声明的 library-x 版本(2.0.0),而选择 Module D 中声明的 library-y 版本(2.0.0)。

结语

Maven,这位版本的裁判,在依赖冲突的领域展现了它的智慧和机智。通过最短路径优先、最先声明优先、传递性依赖原则以及排除传递性依赖等策略,Maven 在项目中解决了版本的纷争,确保了项目的稳定构建。

在你的软件开发旅程中,不要被依赖冲突的问题所困扰。理解 Maven 的解决策略,善用依赖范围,规避传递性依赖的陷阱,是每个开发者都应该掌握的技能。愿你的项目构建顺利,版本的纷争不再是无解的难题,而是一场被明智处理的盛宴。在版本的舞台上,愿你的项目始终闪耀着稳定而明亮的光芒!

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RDP爆破

工具&#xff1a;超级弱口令检查工具 第一步&#xff1a;双击打开工具 第二步&#xff1a;导入账号 第三步&#xff1a;导入密码 第三步&#xff1a;线程 线程默认是50&#xff0c;如果担心影响业务可以修改为5 第四步&#xff1a;填写目标 第五步&#xff1a;选择需要检查的…

前端入职配置新电脑!!!

前端岗位入职第一天到底应该做些什么呢&#xff1f;又该怎样高效的认识、融入团队&#xff1f;并快速进入工作状态呢&#xff1f;这篇文章就来分享一下&#xff0c;希望对即将走向或初入前端职场的你&#xff0c;能够有所帮助。内含大量链接&#xff0c;欢迎点赞收藏&#xff0…

jenkins使用公共库问题

Jenkins解决上编译解决引用问题 本地运行 把公共库创建链接到指定项目目录下即可 mklink /d /j D:\codepath\xxxx\yyyyy\tool_base D:\codepath\tool_base

香港公司变更注册地址所需材料及流程全解析

香港公司变更注册地址&#xff1a;所需材料及流程全解析 各位老板好&#xff0c;我是经典世纪胡云帅&#xff0c;随着业务的拓展和发展&#xff0c;香港公司可能需要变更其注册地址。变更注册地址不仅关系到公司的日常运营&#xff0c;还与公司的法律地位和品牌形象息息相关。本…

cesium HeadingPitchRoll HeadingPitchRange

一、HeadingPitchRoll表示Heading、Pitch、Roll&#xff0c;用于orientation属性上的&#xff0c;比如camera的setView&#xff0c;flyTo var heading Cesium.Math.toRadians(0.0);var pitch Cesium.Math.toRadians(-25.0);var roll Cesium.Math.toRadians(0);viewer.camera…

餐饮店引流活动方案与最佳营销方案揭秘

想开实体店或正在创业的朋友们&#xff0c;大家好&#xff01;我是一名资深的实体店创业者&#xff0c;本人经营鲜奶吧5年时间&#xff0c;做的是社区店&#xff0c;今天我将分享一些餐饮店引流活动和营销方案的干货&#xff0c;希望能给大家带来一些启发和帮助。 一、引流活动…

基于多尺度视网膜增强图像去雾算法(MSR,Multi-Scale Retinex),Matalb实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供有偿…

【Flink SQL】Flink SQL 基础概念(四):SQL 的时间属性

《Flink SQL 基础概念》系列&#xff0c;共包含以下 5 篇文章&#xff1a; Flink SQL 基础概念&#xff08;一&#xff09;&#xff1a;SQL & Table 运行环境、基本概念及常用 APIFlink SQL 基础概念&#xff08;二&#xff09;&#xff1a;数据类型Flink SQL 基础概念&am…

浅谈C++的模板—— 这一篇就够了

今天我们来谈谈C中有关于模板的知识&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;对于C模板来说&#xff0c;我们首先得了解以下几个术语 函数模板模板函数模板实例化模板特例化模板的实参推演模板的非类型参数非模板函数类模板模板类选择性实例化 下面&#xff0c;我…

在Visual Studio中调试 .NET源代码

前言 在我们日常开发过程中常常会使用到很多其他封装好的第三方类库&#xff08;NuGet依赖项&#xff09;或者是.NET框架中自带的库。如果可以设置断点并在NuGet依赖项或框架本身上使用调试器的所有功能&#xff0c;那么我们的源码调试体验和生产效率会得到大大的提升。今天我…

数据分析 | Matplotlib

Matplotlib 是 Python 中常用的 2D 绘图库&#xff0c;它能轻松地将数据进行可视化&#xff0c;作出精美的图表。 绘制折线图&#xff1a; import matplotlib.pyplot as plt #时间 x[周一,周二,周三,周四,周五,周六,周日] #能量值 y[61,72,66,79,80,88,85] # 用来设置字体样式…

vulnhub ---- Dr4g0n b4ll

文章目录 网段扫描隐藏目录隐写尝试通过ssh连接提权路径劫持 网段扫描 nmap -sn 命令用于执行主机存活扫描&#xff0c;仅检测目标网络中的活动主机&#xff0c;而不进行端口扫描。 ┌──(root㉿kali)-[~/Downloads] └─# nmap -sn 10.10.10.0/24 …

计算机网络——物理层(宽带接入技术)

计算机网络——物理层&#xff08;宽带接入技术&#xff09; 什么是宽带有线带宽接入xDSLADSL 技术ADSL 的大部分组成 光纤同轴混合网&#xff08;HFC 网&#xff09;机顶盒与电缆调制解调器&#xff08;set-top box&#xff09; FTTx 技术光配线网 ODN (Optical Distribution …

nginx 基本使用、借助 nginx 和 mkcert 实现本地 https://localhost 测试。

CSDN 如何将资源设置为免费&#xff1f; 安装和基本使用 进入 nginx 官网 下载 Mainline version 版本 解压到一个你喜欢的位置&#xff0c;比如解压到 C: 目录 不管配不配置环境变量&#xff0c;对 nginx 的所有操作都应该在对应文件夹中 基本命令的使用&#xff1a; cd …

性能测试 事务 -- HPE Virtual User Generator -Web -HTTP/HTML

软件介绍 Virtual User Generator &#xff0c;记录用户流程并创建一个自动化性能测试脚本 Controller&#xff0c;单一控制点&#xff0c;轻松、有效地控制所有Vuser&#xff0c;执行期间监控场景性能 Analysis&#xff0c;生成性能测试报告&#xff0c;以图表形式呈现。 操…

2024图表分析网页模版大数据可视化大屏电子沙盘合集包含金融行业智慧大厅智慧交通智慧门店智慧物流智慧小区

2024图表分析网页模版大数据可视化大屏电子沙盘合集包含金融行业智慧大厅智慧交通智慧门店智慧物流智慧小区 项目介绍&#xff1a; 图表分析网页模版 大数据可视化大屏电子沙盘合集&#xff0c;项目基于html/css/js&#xff0c;包含行业&#xff1a; 智慧政务 智慧社区 金融行…

mysql 更新时,旧值与新值相同会怎么做?

文章目录 1 问题描述2 验证2.1 验证猜想12.2 验证猜想2 3 结论4 mysql 为什么这么设计呢&#xff1f; 1 问题描述 创建一张表t&#xff0c;插入一行数据 mysql> CREATE TABLE t ( id int(11) NOT NULL primary key auto_increment, a int(11) DEFAULT NULL ) ENGINEInnoDB…

第111讲:Mycat实践指南:固定Hash算法分片下的水平分表详解

文章目录 1.固定Hash算法分片的概念1.1.固定Hash算法的概念1.2.固定Hash算法是如何将数据路由到分片节点的 2.使用固定Hash算法分片对某张表进行水平拆分2.1.在所有的分片节点中创建表结构2.2.配置Mycat实现固定Hash算法分片的水平分表2.2.1.配置Schema配置文件2.2.2.配置Rule分…

unityprotobuf自动生成C#

Release Protocol Buffers v3.19.4 protocolbuffers/protobuf GitHub 导入Source code 里面的 csharp/src/Google.Protobuf 进入Unity 拷贝其他版本的 System.Runtime.CompilerServices.Unsafe进入工程 使用protoc-3.19.4-win32 里面的exe去编译proto文件为C# using Sys…

MybatisPlus-Generator自定义模版生成CRUD、DTO、VO、Convert等

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 简介 如标题所言&#xff0c;本篇文章介绍如何使用MybatisPlus-Generator自定义模版生成CRUD、DTO、V…