Maven学习(依赖版本维护、依赖传递、解决Maven依赖冲突的3种方式)

目录

一、Maven的依赖版本维护。

(1)为什么需要依赖版本维护?

(2)依赖统一管理的具体操作步骤。

第一步。在pom.xml文件中使用标签定义jar包的版本。

第二步。在的对应jar的中使用"${}"引入上面定义好的版本。

二、Maven的依赖传递。

(1)什么是Maven依赖传递?

(2)Maven依赖传递引发的问题。

三、解决Maven依赖传递导致的依赖冲突问题。

(1)什么是Maven依赖冲突?

(2)解决依赖冲突的3种方法。

方法1。Maven自提供的调解原则。(自动)

方法2。排除依赖——排除依赖间接传递jar包。

方法3。锁定指定jar包的版本。


  • 本篇博客的内容是涉及Maven的高级特性。
  • Maven的高级特性(模块化、聚合、依赖管理)。本篇博客的主要内容是偏向于Maven的依赖管理。

一、Maven的依赖版本维护。

(1)为什么需要依赖版本维护?
  • Maven是一个项目管理工具。主要作用是在项目开发阶段对项目进行依赖管理项目构建以及管理插件
  • POM(Project Object Model)指的是项目对象模型,用来描述当前的Maven项目。它是Maven项目的核心文件。Maven项目的所有依赖都是添加到pom.xml文件里面

  • 如果pom.xml文件中引入的依赖太多,而各种依赖又有不同的版本。
  • 为了统一维护版本!可以将所有依赖的版本号取出来进行统一管理。具体操作步骤如下。
(2)依赖统一管理的具体操作步骤。
  • 这里使用javax.servlet包下的servlet-api进行演示操作。
  • 先去Maven中央仓库寻找到指定的jar包。


  • 直接复制坐标并引入pom.xml文件。


  • servlet-api2.5坐标
<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope>
</dependency>
  • 第一步。在pom.xml文件中使用<properties>标签定义jar包的版本。
<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!--指定servlet-api版本号--><servlet-api.version>2.5</servlet-api.version></properties>
  • 第二步。在<dependency>的对应jar的<version>中使用"${}"引入上面定义好的版本。
<!--添加依赖--><dependencies><!--javax.servlet/servlet-api依赖--><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>${servlet-api.version}</version><scope>provided</scope></dependency></dependencies>
  • 刷新Maven。查看已添加的依赖!

二、Maven的依赖传递。

(1)什么是Maven依赖传递?
  • 简单的讲:依赖传递就是当我们在项目中引入某个jar包时,所引入的jar包所依赖的jar包也会跟着传递并一起引入进来

  • 在Maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。

(2)Maven依赖传递引发的问题。
  • 通过下面图可以看到。当我们的web项目直接依赖了spring-webmvc,而spring-webmvc依赖了sping-aop、spring-beans、spring-core等。
  • 最终的结果就是在我们的web项目中间接依赖了spring-aop、spring-beans、spring-core等。


  • 问题:如果我项目需要的spring-core的jar版本不是间接依赖的版本6.2.0。而是需要直接导入指定版本6.1.12该如何解决?
  • 它们之间一起导入的会冲突吗?还是通过其他的方法去解决依赖冲突的问题?下面接着讨论如何解决依赖传递引发的依赖冲突问题!

三、解决Maven依赖传递导致的依赖冲突问题。

(1)什么是Maven依赖冲突?
  • 在项目中同时依赖了多个相同作用的jar。比如spring-aop : 5.0.2和spring-aop : 5.0.5。

  • 当使用Maven引入了Servlet的jar包。且不写<scope>provided</scope>这一行标签
<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version>
</dependency>
  • 当我们把项目部署到tomcat服务器上时,就会报引入的jar包冲突问题!
  • 因为在Tomcat服务器中已经内置了servlet的jar包。所以我们就得给javax.servlet的依赖作用范围设置为provided。表示依赖范围到打包部署为止,这样就能解决这个冲突。


(2)解决依赖冲突的3种方法。
方法1。Maven自提供的调解原则。(自动)
  • 第一声明者优先原则!该原则用于:依赖间接传递jar包之间在pom.xml文件中,先声明哪个jar包,就以那个jar包为主。
  • 路径近者优先原则!Maven会优先使用自己导入的jar包。依赖中间接传递的jar包排其次 直接依赖高于间接依赖

方法2。排除依赖——排除依赖间接传递jar包。
  • 在对应的jar包的<dependency>内使用<exclusions>与<exclusion>进行排除指定依赖传递的jar包
  • 这里拿前面项目pom文件直接引入spring-webmvc依赖时,间接引入依赖spring-core举例。我排除指定的传递依赖(spring-core),再重新指定其版本为6.1.12。
<!--添加依赖--><dependencies><!--https://mvnrepository.com/artifact/org.springframework/spring-webmvc--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.2.0</version><!--排除该依赖--><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></exclusion></exclusions></dependency><!--排除后再使用6.1.12spring-core--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>6.1.12</version></dependency></dependencies>
方法3。锁定指定jar包的版本。
  • 使用标签<dependencyManagement>指定某个jar包的版本是什么。即将jar包版本锁定。但是注意还是需要在<dependencies>与<dependency>内引入依赖,但可以不需要再指定其版本
<!--依赖管理--><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>6.1.12</version></dependency></dependencies></dependencyManagement><!--添加依赖--><dependencies><!--https://mvnrepository.com/artifact/org.springframework/spring-webmvc--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.2.0</version></dependency><!--使用6.1.12spring-core--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency></dependencies>

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

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

相关文章

CV(4)--边缘提取和相机模型

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 边缘提取&#xff08;涉及语义分割&#xff09;&#xff1a; 图象的边缘是指图象局部区域亮度变化显著的部分,也有正负之分&#xff0c;暗到亮为正 求边缘的幅度&#xff1a;sobel&#xff0c;Canny算子 图像分高频分量和低…

鸿蒙项目云捐助第三讲鸿蒙App应用的启动页实现

鸿蒙项目云捐助第三讲鸿蒙App应用的启动页实现 对于移动端的应用&#xff0c;一般启动app的时候&#xff0c;首先显示启动页&#xff0c;启动页中显示出该应用一些介绍内容&#xff0c;通过这个介绍内容可以了解这个应用具体处理的内容。 进入启动后&#xff0c;通过滑动启动…

flink sink kafka的事务提交现象猜想

现象 查看flink源码时 sink kafka有事务提交机制&#xff0c;查看源码发现是使用两阶段提交策略&#xff0c;而事务提交是checkpoint完成后才执行&#xff0c;那么如果checkpoint设置间隔时间比较长时&#xff0c;事务未提交之前&#xff0c;后端应该消费不到数据&#xff0c…

Mumu模拟器12开启ADB调试方法

在使用安卓模拟器进行开发或调试时&#xff0c;ADB&#xff08;Android Debug Bridge&#xff09;是一项不可或缺的工具。大多数模拟器默认开启了ADB调试功能&#xff0c;但在安装最新版的 Mumu模拟器12 时&#xff0c;可能会遇到 adb devices 无法识别设备的问题。 问题描述 …

C/C++中的宏定义

在C程序中&#xff0c;可以用宏代码提高执行效率。宏代码本身不是函数&#xff0c;但使用起来像函数。预处理器用复制宏代码的方式代替函数调用&#xff0c;省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程&#xff0c;从而提高了速度&#xff0c;避免函数…

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(二)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…

批量导出工作簿中高清图片-Excel易用宝

我同事在工作簿中做了三个图表&#xff0c;现在需要将工作簿中的图标导出保存为高清图片&#xff0c;通过右键另存为保存的图片并非高清图片&#xff0c;其实要把Excel工作簿中的图表或图片对象导出为高清图片也很简单。 单击Excel易用宝 Plus&#xff0c;导出高清图片。 在导出…

测试工程师八股文05|功能测试、业务测试

一、基础概念 1、软件测试分类 1️⃣按照软件产生的阶段划分 单元测试&#xff1a;针对程序源代码进行测试【开发自测】集成测试&#xff1a;针对模块之间功能交互进行测试系统测试&#xff1a;对整个系统&#xff08;功能、非功能&#xff09;进行全面测试验收测试&#xff…

“AI全网络深度学习系统:开启智能时代的新篇章

嘿&#xff0c;大家好&#xff01;今天咱们来聊聊一个特别前沿的话题——AI全网络深度学习系统。这名字听起来是不是有点像科幻电影里的玩意儿&#xff1f;但其实&#xff0c;它已经悄悄地走进了我们的生活&#xff0c;而且正在改变我们的工作方式。 首先&#xff0c;咱们得搞清…

【Linux|计算机网络】HTTPS工作原理与安全机制详解

目录 1、HTTPS是什么&#xff1f; 2、概念准备 2.1.什么是加密、解密、密钥 2.2.为什么要加密 2.3.常见的加密方式 1.对称加密 2.非对称加密 2.4.数据摘要 && 数据指纹 2.5. 数字签名 3.HTTPS 的工作过程探究 方案 1 - 只使用对称加密 方案 2 - 只使用非对…

shell脚本自动发布Java应用

单体项目或定制化小应用&#xff0c;频繁发布会有些麻烦&#xff0c;用脚本实现git提交完代码自动发布&#xff0c;并完成jar包备份 1.前提条件&#xff1a;linux安装了JDK、Maven、Git 安装参考链接&#xff1a; jdk安装 https://blog.csdn.net/weixin_44904239/article/de…

搭建自己的wiki知识库(重新整理)

写在前面&#xff1a; 之前写过一篇&#xff0c;因为这次修改的内容比较多&#xff0c;所以不想在原基础上修改了&#xff0c;还是重新整理一篇吧。搭建wiki知识库&#xff0c;可以使用在线文档&#xff0c;如xx笔记、xx文档、xx博客、git仓库&#xff08;如&#xff1a;GitHu…

【Python网络爬虫笔记】10- os库存储爬取数据

os库的作用 操作系统交互&#xff1a;os库提供了一种使用Python与操作系统进行交互的方式。使用os库来创建用于存储爬取数据的文件夹&#xff0c;或者获取当前工作目录的路径&#xff0c;以便将爬取的数据存储在合适的位置。环境变量操作&#xff1a;可以读取和设置环境变量。在…

MySQL:表的内置函数

目录 一. 日期函数 二. 字符串函数 三. 数学函数​编辑 四. 其他函数 博客开始为各位读者介绍一个投递简历的平台&#xff1a;万码优才 专属于程序员的投递平台&#xff0c;大家快去试试吧&#xff01;&#xff01;&#xff01; 此篇博客讲解MySQL中关于表的内置函数。…

亚马逊云科技2024 re:Invent大会亮点:Nova大模型与AI基础设施全面升级

引言 作为云计算领域的年度盛会,亚马逊云科技(AWS)的re:Invent大会一直是业界瞩目的焦点。2024年的大会不负众望,推出了一系列重磅产品和服务,尤其是在人工智能和大模型方面的创新令人印象深刻。本文将为您深入解析此次大会的主要亮点,探讨AWS在AI时代的最新布局及其对行业的潜…

(九)机器学习 - 多项式回归

多项式回归&#xff08;Polynomial Regression&#xff09;是一种回归分析方法&#xff0c;它将自变量 xx 和因变量 yy 之间的关系建模为 nn 次多项式。多项式回归的目的是找到一个 nn 次多项式函数&#xff0c;使得这个函数能够最好地拟合给定的数据点。 多项式回归的数学表达…

米家智能设备接入苹果HomeKit,使用NAS部署『Homebridge』

米家智能设备接入苹果HomeKit&#xff0c;使用NAS部署『Homebridge』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 说起HomeKit很多苹果用户都不陌生&#xff0c;作为苹果自己的智能家居生态控制系统&#xff0c;我们可以通过苹果自家应用【家庭】&#xff0c;无论是在家中还是远…

docker入门实践---虚拟机环境配置

文章目录 1.检查内核版本2.确定centos7可以上网3.关闭防火墙4.关闭防火墙5.更换阿里云6.安装gcc7.设置镜像仓库&#xff08;阿里云&#xff09;8更新软件包9.安装docket-ce10.启动docker11.普通用户权限设置 1.检查内核版本 2.确定centos7可以上网 3.关闭防火墙 下面的这个表示…

day11 性能测试(3)——Jmeter 断言+关联

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、复习 2、查看结果树 多个http请求原因分析 3、作业 4、Jmeter断言 4.1 响应断言 4.1.1 案例 4.1.2 小结 4.2 json断言 4.2.1 案例 4.2.2 小结 4.3 断言持续时间 4.3.1 案例 4.3.2 小结 4.…

卫生人员评审专家申报系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…