Maven - 依赖三大原则

news2025/1/20 7:24:16

文章目录

  • 概述
    • 最短路径优先原则
    • POM 文件中声明顺序优先原则
    • 覆盖优先原则
  • MAVEN 依赖冲突常见报错
  • Maven 依赖加载流程

在这里插入图片描述


概述

Maven 是一个流行的构建工具,用于管理和构建Java项目。它遵循一些核心原则,以确保项目的构建和依赖管理能够高效、一致地进行。以下是您提到的三大原则的解释:


最短路径优先原则

在Maven中,最短路径优先原则指的是当解决项目依赖关系时,Maven会尽量选择最短路径来满足这些依赖关系。这意味着当有多个不同版本的依赖项可供选择时,Maven会选择路径最短的那个版本。这有助于避免由于依赖版本冲突而引发的问题,因为最短路径通常是最直接和合理的依赖选择。

举例:

当项目直接依赖一个 C-api-1.0 和 A-api-2.1 包,并且 C-api-1.0 有如下间接依赖关系: C-api-1.0 —> B-api-1.0 —> A-api-1.1 这时候项目里包含了 A-api 的 1.1 和 2.1 两个版本,由于存在最短路径原则明显 Project —> A-api-2.1 短于 Project —> C-api-1.0 —> B-api-1.0 —> A-api-1.1 故 Project 项目里会使用 A-api-2.1

在这里插入图片描述

示例项目中包含如下依赖

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency><dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.10-FINAL</version>
    </dependency><dependency>
      <artifactId>QLExpress</artifactId>
      <groupId>com.alibaba</groupId>
      <version>3.2.2</version>
    </dependency></dependencies>

其中 poi-ooxml 存在如下依赖关系: poi-ooxml-->poi-->commons-logging (版本 1.1 ) QLExpress 存在如下依赖关系: QLExpress —> commons-logging (版本 1.1.1 ) 由于存在最短路径原则,明显 QLExpress —> commons-logging 路径更短,项目会使用 commons-logging 的 1.1.1 版本

在这里插入图片描述


POM 文件中声明顺序优先原则

POM(Project Object Model)是Maven项目的核心配置文件,其中定义了项目的依赖、插件、构建配置等信息。POM 文件中声明顺序优先原则强调了在POM 文件中元素的声明顺序对于项目的继承和覆盖机制的影响。具体来说,子项目的POM 文件会继承父项目的POM 配置,但是如果子项目在自己的POM 文件中声明了相同的配置元素,那么子项目的声明会覆盖父项目的相应声明。因此,为了更好地理解和管理项目的继承和覆盖关系,声明的顺序在一些情况下变得很重要。

当项目里存在直接依赖 C-api-1.0 和 B-api-1.0 其中存在如下间接依赖关系: C-api-1.0 —> A-api-2.1 B-api-1.0 —> A-api-1.1 这时项目间接依赖了 A-api 的 2.1 和 1.1 两个版本,由于存在 POM 文件中申明顺序优先原则,故项目中会使用 A-api-2.1

在这里插入图片描述

示例项目中存在如下依赖

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
​
​
  <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.10-FINAL</version>
  </dependency><dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>3.17-beta1</version>
  </dependency>
</dependencies>

其中 poi-ooxml 依赖了包 poi ,poi-scratchpad 也依赖了 poi 包,但是 poi-ooxml 依赖了 poi 包的 3.10-FINAL 版本, poi-scratchpad 依赖了 poi 包的 3.17-beta1 版本,由于存在申明顺序优先原则,项目会使用 poi 包的 3.10-FINAL 版本

在这里插入图片描述


覆盖优先原则

覆盖优先原则是指当一个项目依赖于多个版本不同的相同依赖项时,Maven 会选择最近声明的那个版本作为实际使用的版本。这种行为在大多数情况下能够确保项目使用最新的依赖版本,但也可能会导致意外的依赖冲突。为了避免潜在的问题,开发者需要谨慎地管理项目的依赖关系,确保所选择的依赖版本是经过充分测试和兼容性验证的。

项目父 POM 中直接依赖包 A-api-1.1 ,子模块 Module A 的 parent 直接依赖了项目的 POM ,但是同时也直接依赖了 A-api-1.2 。 由于存在覆盖优先原则子模块 Module A 中会优先使用 A-api-1.2 而不是父POM的 A-api-1.1
在这里插入图片描述

在以上项目工程下,新建一个子工程,在子工程POM添加如下依赖

<dependencies>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>5.2.3</version>
    </dependency>
</dependencies>

由于外部工程依赖了 poi 包的 3.10-FINAL ,但是子工程依赖了 poi 的 5.2.3 版本,故整体包依赖会包含poi的两个版本,但是在子工程中使用的是 5.2.3
在这里插入图片描述


这些原则有助于确保Maven项目的依赖管理和构建过程具有可预测性、一致性,并且能够最大程度地避免依赖冲突等问题。


MAVEN 依赖冲突常见报错

ClassNotFoundException
当项目启动时出现 ClassNotFoundException 这样的错误,表示由于项目使用的包版本下找不到当前需要的类
1、调用 class 的 forName 方法时,找不到指定的类。
2、 ClassLoader 中的 findSystemClass() 方法时,找不到指定的类。
3、 ClassLoader 中的 loadClass() 方法时,找不到指定的类。

NoSuchMethodError
NoSuchMethodError 就是程序在运行中找不到运行的方法导致的
1、有可能发生的就是 jar 冲突,可能是两个高低版本的 jar 包导致。
2、有可能是有两个 jar 包有相同的类与方法,导致程序调用过程中找不到正确的方法。


Maven 依赖加载流程

Maven 依赖加载流程如下

  1. 首先,将 parent 的直接依赖,间接依赖,还有依赖管理,插入本项目,放入本项目的直接依赖,间接依赖还有依赖管理之前。

  2. 对于直接依赖,如果有 version,那么就依次放入 DependencyMap 中。如果没有 version ,则从依赖管理中查出来 version,之后放入 DependencyMap 中。 key 为依赖的 groupId + artifactId, value 为 version ,后放入的会把之前放入的相同 key 的 value 替换。

  3. 对于每个依赖,各自按照步骤 1 和 2 加载自己的 pom 文件,但是如果第一步中的本项目 dependency management 中有依赖的版本,使用本项目 dependency management 的依赖版本,生成 TransitiveDependencyMap ,这里面就包含了所有的间接依赖。

  4. 所有间接依赖的 TransitiveDependencyMap , 对于项目的 DependencyMap 里面没有的 key ,依次放入项目的 DependencyMap 。

  5. 如果 TransitiveDependencyMap 里面还有间接依赖,那么递归执行步骤 3 和 4 。

由于是先放入本项目的 DependencyMap ,再去递归 TransitiveDependencyMap ,这就解释了 Maven 依赖的最短路径原则
在这里插入图片描述
在这里插入图片描述

参考: MAVEN依赖的优先原则

在这里插入图片描述

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

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

相关文章

在CMD脚本中生成空心字

背景 程序启动时&#xff0c;需要通过串口向外打印信息&#xff0c;想在信息最前面打印一个log&#xff0c;如下图所示&#xff1a; win自带的CMD安装pyfiglet 使用pip安装pyfiglet&#xff0c;如下&#xff1a; pip install pyfiglet安装成功后如下图&#xff1a; 运行以…

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第一节、二节:图像描述概述和特征点

文章目录 一&#xff1a;图像描述概述&#xff08;1&#xff09;图像描述&#xff08;2&#xff09;描述子 二&#xff1a;特征点&#xff08;1&#xff09;Moravec角点检测A&#xff1a;原理B&#xff1a;程序 &#xff08;2&#xff09;Harris角点检测A&#xff1a;原理B&…

YII项目在Docker中运行缓慢

缓慢问题分析 请求YII的api时间请求原生查询时间win10 上运行docker上的php api异常慢ubuntu 中拉代码git报错 请求YII的api时间 请求原生查询时间 win10 上运行docker上的php api异常慢 链接阿里数据的 入口直接返回的 网上有说是docker的dns解析慢&#xff1b; 也有说是…

方面级别情感分析之四元组预测

情感四元组预测现有方法 阅读本文之前我们默认你对情感分析有基本的认识。 如果没有请阅读文章(https://tech.tcl.com/post/646efb5b4ba0e7a6a2da6476) 情感分析四元组预测涉及四个情感元素: 方面术语a&#xff0c;意见术语(也叫观点术语)o&#xff0c; 方面类别ac&#xff0c…

使用python对光谱数据进行lorentz峰值拟合

1、lorentz峰值拟合 发光光谱是一种用于表征二维半导体材料光学性质的重要技术&#xff0c;它可以反映出材料中的载流子密度、缺陷态、激子束缚能等信息。 由于二维半导体材料的厚度极其薄&#xff0c;其发光信号往往很弱&#xff0c;且受到基底、环境和测量设备等因素的干扰…

访问学者如何办理延期回国

近年来&#xff0c;随着国际交流的不断深入&#xff0c;越来越多的学者选择走出国门&#xff0c;到异国他乡进行访问学习。然而&#xff0c;有时由于研究项目进展或个人原因&#xff0c;访问学者可能需要延期回国。那么&#xff0c;访问学者在延期回国时应该如何办理手续呢&…

[Go版]算法通关村第十五关黄金——继续研究超大规模数据场景的问题

目录 题目&#xff1a;对20GB文件进行排序解决思路&#xff1a;外部排序 两两合并 题目&#xff1a;超大文本中搜索两个单词的最短距离解决思路&#xff1a;双指针法复杂度&#xff1a;时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( 1 ) O(1) O(1) 题目&#xff1a;从10亿数字…

ChatGPT AIGC 一个指令总结Python所有知识点

在ChatGPT中,直接输入一个指令就可以生成Python的所有知识点大纲。 非常实用的ChatGPT功能。 AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http://t.…

优秀产品经理的产品定位策略

产品定位是指在产品设计之初或在市场推广过程中&#xff0c;通过广告宣传等营销手段&#xff0c;使得产品在消费者心中确立具体形象的过程。这样有利于目标用户快速决策选择该产品。 如果没有明确的产品定位或产品定位模糊不清&#xff0c;目标用户对该产品印象不深刻&#xff…

干货丨软件测试行业迎来新时代,AI将成为主流技术?

随着科技日新月异的发展&#xff0c;人工智能正逐渐渗透到我们生活的各方各面&#xff0c;从智能语音助手到自动驾驶汽车、从智能家居到人脸识别技术&#xff0c;AI正以其卓越的智能和学习能力引领着新时代的发展方向。 在这个快速演进的时代中&#xff0c;软件测试领域也受到了…

STM32单片机示例:64位全局时间戳发生器

文章目录 目的基础说明测试代码总结示例链接 目的 STM32H743 / H750 系列的芯片有一个64位的全局时间戳发生器&#xff08; Global timestamp generator &#xff09;&#xff0c;这篇文章将对它的使用做个记录。 基础说明 全局时间戳发生器相关的内容可以参考官方参考手册&…

如何解决高并发中的I/O瓶颈?

我们都知道&#xff0c;在当前的大数据时代背景下&#xff0c;I/O的速度比内存要慢&#xff0c;尤其是性能问题与I/O相关的问题更加突出。 在许多应用场景中&#xff0c;I/O读写操作已经成为系统性能的一个重要瓶颈&#xff0c;这是不能忽视的。 什么是I/O&#xff1f; I/O作为…

基于RabbitMQ的模拟消息队列之四——内存管理

文章目录 一、设计数据结构二、管理集合1.交换机2.队列3.绑定4.消息5.队列上的消息6.待确认消息7.恢复数据 一、设计数据结构 针对交换机、队列、绑定、消息、待确认消息设计数据结构。 交换机集合 exchangeMap 数据结构&#xff1a;ConcurrentHashMap key:交换机name value:交…

视频剪辑高手揭秘:如何巧妙改变尺寸,打造完美画面

视频剪辑高手揭秘&#xff1a;如何巧妙改变尺寸&#xff0c;打造完美画面 在数字媒体时代&#xff0c;视频剪辑已经成为一项至关重要的技能。不仅在专业电影制作领域&#xff0c;也在个人创作和社交媒体传播中发挥着重要作用。本文将向你介绍一位视频剪辑高手&#xff0c;并揭…

NIO原理浅析(二)

IO分类 阻塞和非阻塞 阻塞IO&#xff1a;用户空间引发内核空间的系统调用&#xff0c;需要内核IO操作彻底完成之后&#xff0c;返回值才会返回到用户空间&#xff0c;执行用户的操作。阻塞指的用户空间程序的执行状态&#xff0c;用户空间程序需要等到IO操作彻底执行完毕。j…

《关键跨越:从业务高手到优秀主管》:最大化团队产出

作者&#xff1a;北森人才管理研究院 阅读时长&#xff1a;6小时21分钟 评分&#xff1a;5星 失控最鲜明的特征之一是管理者工作的时间越来越长&#xff0c;但结果越来越糟。很多新手管理者看到下属无法完成任务&#xff0c;或者担心出错&#xff0c;对下属不放心&#xff0c;出…

Linux学习之RAID删除

参考《Linux软件raid删除》 我部署 RAID的步骤在《Linux学习之RAID》 sudo umount /dev/md0先进行卸载。 sudo mdadm -S /dev/md0停止/dev/md0。 sudo mdadm -A -s /dev/md0可以重新开始/dev/md0&#xff0c;这里只是拓展一下。 sudo mdadm -S /dev/md0停止/dev/md0。 s…

Cesium 加载 geojson 文件并对文件中的属性值进行颜色设置

文章目录 需求分析解决 需求 Cesium 加载 geojson 文件并对文件中的属性值进行颜色设置 分析 在搜寻多种解决方案后&#xff0c;最后总结出 自己的解决方案 方案一&#xff0c;没看懂 var geojsonOptions {clampToGround : true //使数据贴地};var entities;promise Cesium…

详解产品项目管理软件:介绍与比较

产品项目管理是指通过有效的规划、组织和控制来管理产品开发过程的一系列活动。它涵盖了需求分析、产品设计、开发、测试以及上市等不同阶段&#xff0c;并需要协调多个团队成员的工作。通过产品项目管理&#xff0c;团队可以更好地把握产品的战略目标、工作进度和资源分配&…

Oracle-day6:over()函数

目录 一、over()开窗函数 二、无参over()的使用 三、over(partition by 列名) 四、over(order by 列名 asc/desc) 五、over(partition by 列名 order by 列名 asc|desc) 六、练习&#xff08;笔试&#xff09; 一、over()开窗函数 拓展:数据库的版本 oracle:8i 9i 10g …