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

news2025/2/27 10:06:40

目录

一、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.coloradmin.cn/o/2258070.html

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

相关文章

OpenCV 功能函数介绍

一&#xff0c; 二值化函数 功能&#xff1a; 用于对图像进行二值化处理 参数&#xff1a; cv2.threshold(输入你的图像所对应的灰度图&#xff0c; 阈值&#xff1a;是浮点还是整数取决予图像的数据类型 最大值;高于阈值的像素值&#xff0c; 阈值类型&#xff1a;cv2.THR…

JAVA根据Word模板生成word文件

本次要做一个小工具&#xff0c;读取excel数据&#xff0c;然后生成word文件。 直接上代码&#xff1a; 一、引用包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dep…

什么是定性数据分析?有哪些定性数据分析技术及应用实践?

众所周知&#xff0c;定性数据分析软件&#xff08;QDA 软件&#xff09;为研究人员提供了显著的优势&#xff0c;特别是在节省文书工作时间方面&#xff0c;“让研究人员可以从事更有意义的分析工作”。 使用它是从事实际有效研究的最关键步骤之一。然而&#xff0c;知道您需要…

【前端】JavaScript中的闭包与垃圾回收机制详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;垃圾回收机制&#xff08;Garbage Collection, GC&#xff09;垃圾回收的核心原理核心过程 函数作用域与垃圾回收运行分析输出结果 垃圾回收的局限性与挑战 &#x1f4a…

android studio 读写文件操作(应用场景三)

android studio版本&#xff1a;2023.3.1 patch2 例程&#xff1a;filesaveandread 其实我写这个都是我记录我要做后个数独小游戏&#xff0c;每一个都是为了解决一个问题。即是分享也是备忘&#xff0c;反正我什么都不会&#xff0c;就是一顿瞎改&#xff0c;不行就研究。这…

分库分表基本概念讲解

一、基本概念 产生背景 在数据爆炸的年代&#xff0c;单表数据达到千万级别&#xff0c;甚至过亿的量&#xff0c;都是很常见的情景。这时候再对数据库进行操作就是非常吃力的事情了&#xff0c;select个半天都出不来数据&#xff0c;这时候业务已经难以维系。不得已&#xf…

华为自反ACL实验

一、实验背景 做这个实验的原因是最近公司里上了三台小程序服务器&#xff0c;由于三台服务器的端口都映射出去了&#xff0c;领导要求A网段的三台服务器不能访问内网B&#xff0c;C网段&#xff0c;同时B、C网段内网用户可以访问A段的94、95、96服务器&#xff1b; 也就是PC4\…

美图撕掉蔡文胜标签

卖掉比特币的美图不投机了。 作者|周立青 编辑|杨舟 12月5日&#xff0c;比特币突破10万美元大关&#xff0c;曾花费1亿美元购入虚拟货币的美图宣布已出售所有加密货币。 美图在港交所发布公告称&#xff0c;自2024年11月起&#xff0c;公司已开始出售其持有的加密货币&…

git拉取代码报错问题:Pulling is not possible because you have unmerged files. hint

我们在工作中&#xff0c;需要切换到另外一个分支&#xff0c;拉取代码的时候会报这样的问题&#xff1a; Pulling is not possible because you have unmerged files. hint: Fix them up in the work tree, and then use git add/rm <file> hint: as appropriate to ma…

青训营-豆包MarsCode技术训练营试题解析三十七

引言 随着AI领域的发展&#xff0c;底层算法确实起到了决定性的作用。为了跟上这个快速发展的领域&#xff0c;我们需要不断学习和提升自己的技能。刷题是一种很好的方式&#xff0c;可以帮助我们巩固基础知识&#xff0c;提高解决问题的能力。 介绍 ‌豆包青训营‌是由字节…

openlayers地图缓存添加

//通过安装包localforage&#xff08;npm install localforage&#xff09;或https://cdnjs.cloudflare.com/ajax/libs/localforage/1.10.0/localforage.min.js tileCacheStore.js import localforage from localforage var tileCacheStorenull;// 从缓存中获取该瓦片 functio…

《IP 电话:选型指南与应用优势》

《IP 电话&#xff1a;选型指南与应用优势》 一、IP 电话概述二、IP 电话的选型1. 功能与应用2. 性能及可靠性3. 兼容及可升级性4. 外观设计及管理需求5. 性价比 三、IP 电话的应用场景1. 企业办公2. 工厂和仓库3. 酒店和旅游业4. 医疗机构5. 零售业6. 教育机构7. 个人用户 四、…

解决Logitech G hub 无法进入一直转圈的方案(2024.12)

如果你不是最新版本无法加载尝试以下方案&#xff1a;删除AppData 文件夹下的logihub文件夹 具体路径&#xff1a;用户名根据实际你的请情况修改 C:\Users\Administrator\AppData\Local 如果你有通过lua编译脚本&#xff0c;记得备份&#xff01;&#xff01; ↓如果你是最新…

[网络爬虫] Jsoup : HTML 解析工具

1 概述 简介 Jsoup是一款基于Java的HTML解析器&#xff0c;它提供了一种简单、灵活且易于使用的API&#xff0c;用于从URL、文件或字符串中解析HTML文档。它可以帮助开发人员从HTML文档中提取数据、操作DOM元素、处理表单提交等。 主要特点 Jsoup的主要特点包括&#xff1a; 简…

top命令和系统负载

1 top中的字段说明 top是一个实时系统监视工具&#xff0c;可以动态展现出 CPU 使用率、内存使用情况、进程状态等信息&#xff0c;注意这些显示的文本不能直接使用 > 追加到文件中。 [rootvv~]# top -bn 1 | head top - 20:08:28 up 138 days, 10:29, 4 users, load av…

golang实现简单的redis服务4(实现过期时间功能)

为什么要做过期时间?redis失效时间是如何做的redis有那些过期策略,优缺点,实现原理?redis使用的什么方案 redis 有那些内存淘汰策略?常用的是什么,为什么?noeviction: 不处理lru: 未使用时间最久的keylfu: 使用次数最少的keyrandom: 随机keyvolatile与allkeys的区别 仓库地…

VMware:如何在CentOS7上开启22端口

打开虚拟机&#xff1a;【编辑】【虚拟机网络设置】 其中填入的虚拟机IP地址是虚拟机中centos的IP地址&#xff0c;虚拟机端口为需要映射的centos端口 配置好之后保存&#xff0c;打开宿主机 win cmd telnet 192.168.1.26 22 如果出现上述窗口&#xff0c;则说明已经成功开放…

项目中使用AntV L7地图(五)添加飞线

项目中使用AntV L7地图&#xff0c;添加 飞线 文档地址&#xff1a;https://l7.antv.antgroup.com/zh/examples/line/animate/#trip_animate 一、初始化地图 使用的地图文件为四川地图JSON&#xff0c;下载地址:https://datav.aliyun.com/portal/school/atlas/area_selector#&…

基于FPGA的智能电子密码指纹锁(开源全免)

基于FPGA的智能电子密码指纹锁 一、功能描述硬件资源需求 二、整体框架知识准备AS608指纹模块4*4数字键盘模块 三、Verilog代码实现以及仿真验证1.AS608_data模块2.check_hand模块3.four_four_key模块4.check_mima模块5.change_mima模块6.seg_ctrl模块7.uart_top模块8.key_debo…

【Vue2+Element-ui】el-dialog宽度适配

1、不适配问题 分辨率100%-页面 分辨率150%-页面 在项目中&#xff0c;我开发分辨率一直是100%&#xff0c;但是客户使用的分辨率不相同&#xff0c;所以宽度要适配 2、解决-封装mixins.js 1)、封装的mixins 我将宽度设置成动态的&#xff0c;因为我的项目中需求不同。 expor…