Maven:<dependencyManagement>:依赖集中管理

dependencyManagement

Maven <dependencyManagement>,请介绍一下

在Apache Maven构建工具中,<dependencyManagement> 是一个非常重要的元素,用于在一个项目或一组项目的顶级POM(Project Object Model,即项目对象模型)中集中管理和控制所有子模块或子项目所使用的依赖项(dependencies)的版本和其他元数据。其核心作用在于实现依赖版本的一致性和简化依赖管理。

主要特点与作用:

  1. 版本统一

    • 在父POM的<dependencyManagement>部分声明依赖项时,只需指定groupId、artifactId和version,无需 <scope><optional> 等其他配置,子模块引用这些依赖时无需再写版本号,从而确保所有子模块使用的都是同一版本的依赖。
  2. 默认版本定义

    • 当子模块中的 <dependencies> 部分没有显式声明某个依赖的版本时,Maven会到父POM的<dependencyManagement>中查找对应的groupId和artifactId是否有已声明的版本,如果有,则采用那个版本。
  3. 依赖规范模板

    • 即使子模块指定了版本,<dependencyManagement>也可以作为一个版本规范的模板,确保每个依赖遵循一定的规则,比如兼容性要求或者团队约定的特定版本。
  4. 避免重复配置

    • 对于大型项目或者多模块项目,通过 <dependencyManagement> 可以减少大量的重复配置,提高POM文件的可读性和维护性。

示例:

<!-- 在父POM中 -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.20</version> <!-- 统一版本号 --></dependency><!-- 更多依赖... --></dependencies>
</dependencyManagement><!-- 在子模块POM中 -->
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId> <!-- 不需要在这里指定version --></dependency>
</dependencies>

总结来说,<dependencyManagement> 并不直接引入任何依赖到实际项目中,而是为依赖提供了默认的管理和协调机制,让项目中的依赖版本控制更加集中和便捷。同时,它也对传递性依赖的版本具有一定的优先级,即当存在传递依赖时,<dependencyManagement> 中声明的版本将优先于传递过来的版本。

示例分析

MyBatis-Flex 依赖管理的分析

MyBatis-Flex 提供了 模块进行依赖管理,只需要在 标签下进行配置就可以了。

MyBatis-Flex 提供了 mybatis-flex-dependencies 模块进行依赖管理,只需要在 <dependencyManagement> 标签下进行配置就可以了。

<dependencyManagement><dependencies><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-dependencies</artifactId><version>${mybatis-flex.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

分析一下这个Maven配置

这段Maven配置片段位于<dependencyManagement>标签内,其功能是对依赖项进行集中管理和版本控制,而非直接引入依赖到项目的构建路径中。具体解读如下:

  1. <dependencyManagement>:这是Maven的一个顶级元素,用于声明项目中所有依赖项的统一管理规则。它并不直接引入依赖,而是提供了一个模板或者说是基准,项目内的实际<dependencies>可以引用这里的管理规则,这样就不用在每个地方都显式地写明依赖的具体版本号。

  2. <dependencies>:在<dependencyManagement>内部定义了一系列依赖关系。

  3. <dependency>:这是一个具体的依赖定义,包含了以下属性:

    • <groupId>com.mybatis-flex,标识依赖所属的组织或项目组,类似于Java包的命名空间。
    • <artifactId>mybatis-flex-dependencies,指定了依赖的唯一标识符,即工件ID,通常对应一个具体的库或组件名称。
    • <version>${mybatis-flex.version},这里的版本号使用了一个变量,该变量将在构建时根据项目或父POM中定义的实际值进行替换,表示MyBatis Flex依赖的版本。
    • <type>pom,表明这不是一个常规的库文件(如.jar),而是一个POM类型的依赖,意味着这个依赖主要是为了引入一组依赖管理信息,而不是实际的代码依赖。
    • <scope>import,在这种情况下,import作用域表明这个依赖是用来导入另一个POM中的<dependencyManagement>部分。也就是说,当前项目将获取并整合com.mybatis-flex:mybatis-flex-dependencies中定义的所有依赖及其版本管理规则,使得项目可以继承和重用这些规则,确保所有相关的依赖版本一致性。

综上所述,这段配置的主要目的是在项目中引入一个BOM(Bill Of Materials),以方便统一管理与MyBatis Flex相关的所有依赖版本。在实际项目中的其他地方,只需要声明依赖而不必指定版本,Maven会自动使用这里定义的版本信息。

type和 scope 是什么意思?

对于给定的<dependency>元素,typescope属性具有特定的意义:

  1. type:

    • type: 定义了依赖项的类型,默认通常是jar,表示Java归档文件(Java Archive)。在这个例子中,type被设置为pom,这意味着这个依赖是一个“聚合模块”(Parent or Bill of Materials, BOM),而不是一个具体的Java库。通过引入这样的BOM依赖,可以集中管理和控制一组子模块或相关项目的版本,使得所有依赖版本一致。
  2. scope:

    • scope: 定义了依赖范围,即编译、测试、运行等不同阶段此依赖项的作用域。在上述配置中,scope被设置为import,这是一个特殊的范围:
      • import作用域仅在 <dependencyManagement> 部分有效,用于导入其他POM中定义的依赖管理信息。当scope设为import时,Maven会将指定POM中的所有dependency management信息合并到当前项目中,以便统一管理依赖版本,而不会实际引入任何类库到当前构建路径。

官方文档:Dependency Scope,关于import的说明如下:

在这里插入图片描述

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

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

相关文章

TCP/IP协议—TCP

TCP/IP协议—TCP TCP协议TCP通信特点TCP技术概念TCP定时器 TCP头部报文TCP连接三次握手&#xff08;建立连接&#xff09;四次挥手&#xff08;释放连接&#xff09;连接状态 TCP协议 传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种…

Springboot集成Ehcache3实现本地缓存

如果只需要在单个应用程序中使用本地缓存&#xff0c;则可以选择Ehcache&#xff1b;它支持内存和磁盘存储&#xff0c;这里不以注解方式演示&#xff0c;通过自己实现缓存管理者灵活控制缓存的读写&#xff1b; 1、引入相关依赖 <!-- ehcache3集成start --><depende…

苹果在中国市场衰退,全球市场跌幅最大,难怪慌忙大降价

日前市调机构IDC公布了今年一季度全球市场的手机品牌排名&#xff0c;数据显示苹果的跌幅最大&#xff0c;说明它不仅在中国市场衰退&#xff0c;在全球市场也出现衰退&#xff0c;如此也就不奇怪苹果史无前例的在3月份对iPhone15降价1500元促销了。 数据显示一季度苹果的出货量…

阿里云服务器公网带宽按固定和按使用流量怎么选?哪个优惠?

阿里云服务器的公网带宽计费模式分为“按固定带宽”和“按使用流量”&#xff0c;有什么区别&#xff1f;按固定带宽是指直接购买多少M带宽&#xff0c;比如1M、5M、10M、100M等&#xff0c;阿里云直接分配用户所购买的带宽值&#xff0c;根据带宽大小先付费再使用&#xff1b;…

k8s控制器(五)_____DaemonSet

DaemonSet控制器 DaemonSet控制器是Kubernetes中的一种控制器&#xff0c;用于确保集群中的每个节点都运行一个Pod的副本。它通常用于在整个集群中部署一些系统级别的服务&#xff1a; 在每一个node节点运行一个存储服务&#xff0c;例如gluster&#xff0c;ceph。在每一个no…

数据可视化高级技术Echarts(桑基图入门)

目录 一、什么是桑基图 二、基本特征 三、设计注意事项 四、使用Echarts进行初级绘制 1.首先不能忘记五个基本步骤 2.绘制的时需要将图像类型series.type设定为sankey类型。 一、什么是桑基图 桑基图&#xff08;Sankey diagram&#xff09;&#xff0c;即桑基能量分流图&…

2024很漂亮的个人主页HTML源码

源码介绍 很漂亮的个人主页HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 截图效果 源码下载 很漂亮的个人主页HTML源码

[大模型]浦语灵笔图文理解创作

浦语灵笔图文理解&创作 环境准备 首先在 AutoDL 上租一台显卡驱动支持 11.7 以上的双卡 3090 机器. 在选择镜像是选择 Miniconda --> conda3 --> 3.8(ubuntu20.04)–> 11.6 打开 jupyter lab 中的终端&#xff0c;首先运行以下命令安装 PyTorch 2.0.1 # 升级pi…

1043: 利用栈完成后缀表达式的计算

解法&#xff1a; #include<iostream> #include<stack> using namespace std; int main() {char a;stack<int> sk;while (cin >> a && a ! #) {if (a > 0 && a < 9) {sk.push(a - 0);}else {int num2 sk.top();sk.pop();int n…

数字乡村创新实践探索农业现代化与乡村振兴新路径:科技赋能农村全面振兴与农民福祉新纪元

目录 引言 一、数字乡村与农业现代化新路径 1、智慧农业引领农业现代化 2、农业产业链的数字化转型 二、数字乡村与乡村振兴新路径 1、农村信息化水平的提升 2、农村治理模式的创新 三、科技赋能农村全面振兴与农民福祉新纪元 1、提升农业生产效益与农民收入 2、促进…

H.265视频直播点播录像EasyPlayer.js流媒体播放器用户常见问题及解答

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 今天我们来汇总下用户常见的几个问题及解答。 1、EasyPlayer.js播放多路H.265视…

.NET Framework安装失败的原因及解决方法

.NET Framework安装失败的原因及解决方法 大家好我是艾西&#xff0c;一个做服务器租用的游戏爱好者兼网络架构系统环境问题网络工具人。在我们平时使用PC安装某些程序会出现.NET Framework缺失的提示&#xff0c;那么也会有很多的小伙伴搞不懂什么原因导致的&#xff0c;这个问…

hadoop编程之词频统计

数据集实例 java代码&#xff0c;编程 实例 我们要先创建三个类分别为WordCoutMain、WordCoutMapper、WordCoutReducer这三个类 对应的代码如下 WordCoutMain import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Pat…

wps导出pdf文献引用不能跳转解决办法

问题描述 本科论文参考文献使用wps设置交叉引用&#xff0c;但导出pdf后无法跳转引用 尝试 用office word打开文件word版跳转没有问题&#xff0c; 另存为pdf或导出pdf。 但是pdf版跳转完全错误。 16跳到14.但是总体而言都是跳到包含该序号的页 要求不高的话也可以&#x…

文件上传App,H5,小程序多端兼容

插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id5459 下载lsj-upload插件 代码如下 结构 <lsj-upload :option"option" :size"size" :formats"formats" :debug"debug":instantly"instantly" change"…

Redis中的订阅发布(三)

订阅发布 发送消息 当一个Redis客户端执行PUBLISH 命令将消息message发送给频道channel的时候&#xff0c;服务器需要执行以下 两个动作: 1.将消息message发送给channel频道的所有订阅者2.如果一个或多个模式pattern与频道channel相匹配&#xff0c;那么将消息message发送给…

PyPDF2,一个超实用的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超实用的 Python 库 - pypdf。 Github地址&#xff1a;https://github.com/py-pdf/pypdf PDF&#xff08;Portable Document Format&#xff09;是一种广泛用于文档传输和打印的文件格式&…

Hive概述与基本操作

一、Hive基本概念 1.什么是hive? &#xff08;1&#xff09;hive是数据仓库建模的工具之一 &#xff08;2&#xff09;可以向hive传入一条交互式的sql,在海量数据中查询分析得到结果的平台 2.Hive简介 Hive本质是将SQL转换为MapReduce的任务进行运算&#xff0c;底层由HDFS…

【翻译】再见, Clean Code!

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【翻译】再见, Clean Code!正文那是一个深夜次日早晨这只是一个阶段 【翻译】再见…

var cannot be resolved to a type

var cannot be resolved to a type var 是JDK10的产物吧。真的是够懒的人&#xff0c;一个var自动转换类型。 高版本的功能又要放到低版本的平台系统中&#xff0c;【集成】&#xff0c;向下兼容天天改这些。