Maven的依赖传递、依赖管理、依赖作用域
在Maven项目中通常会引入大量依赖,但依赖管理不当,会造成版本混乱冲突或者目标包臃肿。因此,我们以SpringBoot为例,从三方面探索依赖的使用规则。
1、 依赖传递
依赖是会传递的,依赖的依赖也会连带引入。例如在项目中引入了spring-boot-starter-web依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.18</version>
</dependency>
那么业务项目不仅直接引入了spring-boot-starter-web依赖,还间接引入了spring-boot-starter-web的依赖项:
spring-boot-starter、spring-boot-starter-json、spring-boot-starter-tomcat、spring-web、spring-webmvc。
Maven依赖关系如下图所示:

其中,spring-boot-starter-web是直接依赖,spring-boot-starter-web的依赖项:spring-boot-starter、spring-boot-starter-json、spring-boot-starter-tomcat、spring-web、spring-webmvc为间接依赖。
2、依赖管理
2.1、dependencyManagement
maven中的dependencyManagement节点主要用来统一管理依赖项的版本号。如果依赖中,未指定版本号,则采用dependencyManagement引入的pom文件中的版本号。dependencyManagement只用来指定依赖的版本,不会真正引入依赖。
假如pom文件中引入了如下依赖:
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>3.3.1</version><scope>import</scope></dependency></dependencies>
</dependencyManagement>
那么在引入具体依赖时,可以不指定版本号:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
此时, spring-boot-starter-web会自动引入spring-boot-dependencies中指定的版本号3.3.1
2.2、parent
Maven 借鉴了面向对象中的继承思想,提出了 POM 继承思想。一个项目可通过继承父模块的 POM 来获得对相关依赖的声明。其目的是为了消除子模块 POM 中的重复配置,其中不包含有任何实际代码,因此父模块 POM 的打包类型(packaging)必须是 pom。
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version>
</parent>
此时,对于spring-boot-starter-web依赖,会自动引用spring-boot-starter-parent中指定的版本号2.7.18
2.3、dependency
对于普通的依赖,大家用的最多的也便是这种,在声明依赖时直接指定版本号:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.6.15</version>
</dependency>
这种方式最直观,但依赖过多时,不便于统一管理。
2.4、依赖优先级
如果我们将上述三种方式混合使用,放在同一个项目中,且指定了不同的版本号,会产生什么效果呢?
先展示结果如下图:

可以看到直接依赖spring-boot-starter-web的版本为2.6.15,但间接依赖spring-******的版本均为2.7.18。所以结论如下:
优先级:dependence指定版本 > parent指定版本 > dependencyManagement指定版本
dependence指定版本仅限于直接依赖的版本,间接依赖仍然采用parent所指定的版本,dependencyManagement指定的版本最次之。
3、 依赖作用域
在Maven中,可以使用scope来指定当前依赖项的作用域,常见的值有:compile、provided、runtime、test、import等。
3.1 compile
compile也是默认的作用域,如果引入依赖时,没有明确指定作用域,则依赖作用域为compile。
compile作用域的依赖,在编译、测试和运行时均有效,并参与项目的打包过程,该依赖会传递给依赖该模块的其他模块。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.6.15</version><scope>compile</scope>
</dependency>
3.2 provided
provided作用域的依赖,仅在编译和测试时有效,在运行时不可用,且不会参与项目的打包过程,也不会传递给引用项目。
例如,Lombok模块仅用于编译时生成相应的Contructor、Getter、Setter、ToString等方法,但在运行时并不需要这个依赖,因此通常指定为provided,打包后的目标文件中也不包含该依赖:
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope>
</dependency>
3.3 runtime
runtime作用域的依赖,在测试和运行时是可用的,但在编译时是不可用的,也会参与项目的打包过程,其依赖传递给引用该模块的项目。
runtime作用域的模块在编译时不可用,就说明该引用中的类在java代码中也不能直接使用,否则无法编译通过。
例如,mysql数据库驱动在代码中不需要直接调用,代码通常使用mybatis或者java.sql包下的类。因此引入依赖时,通常指定为runtime,在运行时,该驱动包直接注册到程序中:
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version><scope>runtime</scope>
</dependency>
3.4 test
test作用域的依赖,仅在测试时可用(测试代码的编译和执行),其不会参与项目的打包过程,也不会传递给其他模块。
这些依赖中的类只能在src/test/java中使用,无法用于src/main/java中的代码。
测试相关的均属于此类,比如:spring-boot-starter-test、junit等:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
3.5 import
每个项目,一般都会继承自一个父项目,这个父项目可能是公司的一个基础项目,也可能是一个框架项目,比如开头提到的springboot:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version>
</parent>
这个父项目中,父项目的父项目是spring-boot-dependencies,spring-boot-dependencies中会使用dependencyManagement标签对依赖项的版本统一管理,子项目中,可以按需引入dependencyManagement中依赖即可,可以省略版本号。
但是Maven最多只能有一个parent项目,如果把所有的dependencyManagement都加入到parent项目中,又会导致parent项目太臃肿,依赖杂乱不好管理。因此,import作用域便可以解决这个问题。import可以通过非继承的方式批量引入另一个依赖项中。
说明:<scope>import</scope>只能用在dependencyManagement下type为pom的dependency中。
3.6 作用域总结
| 作用域 | 编译时 | 测试时 | 运行时 | 打包时 | 传递性 |
|---|---|---|---|---|---|
| compile | √ | √ | √ | √ | √ |
| provided | √ | √ | × | × | × |
| runtime | × | √ | √ | √ | √ |
| test | × | √ | × | × | × |
| import | √ | √ | × | × | × |
相关文章:
Maven的依赖传递、依赖管理、依赖作用域
在Maven项目中通常会引入大量依赖,但依赖管理不当,会造成版本混乱冲突或者目标包臃肿。因此,我们以SpringBoot为例,从三方面探索依赖的使用规则。 1、 依赖传递 依赖是会传递的,依赖的依赖也会连带引入。例如在项目中…...
ArcGIS定义1.5度带坐标系与投影转换
点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 对于ArcGIS如何定义高斯克吕格3度带、6度带,我相信大部分人都是比较清楚的࿰…...
艺术与科技的精湛融合:探讨AI绘画与AI动画的交汇点
前言 艺术与科技的精湛融合:探讨AI绘画与AI动画的交汇点 在当代社会中,艺术和科技的结合呈现出了从来灭有的创新和可能性。随着人工智能技术的不断发展,AI绘画与AI动画的融合愈发引人瞩目。这一融合不仅给艺术家们带来了更多创作的可能&…...
【移动应用开发期末复习】第五/六章
系列文章 第一章——Android平台概述 第一章例题 第二章——Android开发环境 第二章例题 第三章 第三章例题 第四章 系列文章界面布局设计线性布局表格布局帧布局相对布局约束布局控制视图界面的其他方法代码控制视图界面数据存储与共享首选项信息数据文件SQLite数据库Content…...
excel FORMULA
在Excel中,FORMULA 实际上是一个拼写错误。您可能是指 FORMULA 的正确拼写 FORMULA(这在Excel中不是有效的函数或关键字),但更可能是您想要讨论的是FORMULA(公式)的创建或使用。 在Excel中,您可…...
【学习】开发板接口
工作用到机器的开发板 有如上三个接口 。最右是仿真器,中间是RS232串口,最左是电源线 仿真器 这个是仿真器 接入机器那端用的是SWD模式,另一端通过USB接电脑(这小肥手拍的怪好看)仿真口连接了四条线分别是 VCC&#…...
主干网络篇 | YOLOv5/v7 更换骨干网络之 EfficientNet | 卷积神经网络模型缩放的再思考
主干网络篇 | YOLOv5/v7 更换骨干网络之 EfficientNet | 卷积神经网络模型缩放的再思考 1. 简介 近年来,深度卷积神经网络(CNN)在图像识别、目标检测等领域取得了巨大进展。然而,随着模型复杂度的不断提升,模型训练和…...
如何测试Java应用的性能?
如何测试Java应用的性能? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在开发Java应用程序的过程中,性能测试是一个不可忽视的重要环…...
css 动画
当涉及到CSS动画时,有几种方式可以实现动画效果。以下是一些常见的CSS动画技术: 使用keyframes规则:keyframes规则允许你创建一个动画序列,定义动画的关键帧和属性值。例如,你可以创建一个旋转动画,让一个…...
# 设置 Linux 安全策略允许本地 IP 开通了访问权限
设置 Linux 安全策略允许本地 IP 开通了访问权限 在 Linux 中设置安全策略通常涉及使用 iptables 或者 firewalld( 在较新的 Red Hat/CentOS 版本中)。以下是使用 iptables 允许特定本地 IP 访问的例子: 1、先清除现有的规则(谨…...
C++初学者指南第一步---14.函数调用机制
C初学者指南第一步—14.函数调用机制 文章目录 C初学者指南第一步---14.函数调用机制1.记住:内存的结构2.函数调用是如何工作的3. 不要引用局部变量4. 常见编译器优化5. Inlining内联 1.记住:内存的结构 堆(自由存储) 用于动态存…...
Apache Flink类型及序列化研读生产应用|得物技术
一、背景 序列化是指将数据从内存中的对象序列化为字节流,以便在网络中传输或持久化存储。序列化在Apache Flink中非常重要,因为它涉及到数据传输和状态管理等关键部分。Apache Flink以其独特的方式来处理数据类型以及序列化,这种方式包括它…...
如何使用代理 IP 防止多个 Facebook 帐户关联 - 最佳实践
在社交媒体被广泛应用的今天,Facebook作为全球最大的社交网络平台之一,面临着很多挑战,其中之一就是用户行为的管理和安全。 为了防止多个账户之间的关联和滥用,Facebook需要采取一系列措施,其中包括使用静态住宅代理…...
DDei在线设计器-API-DDeiAbstractShape
DDeiAbstractShape DDeiAbstractShape代表是所有可见图形的父类,定义了图形所需要的公共属性和方法。 DDeiAbstractShape实例包含了一个图形的所有数据和渲染器,在获取后可以通过它访问其他内容。DDeiAbstractShape中的layer指向所在图层,stage指向所…...
IPython的使用技巧整理
关于IPython的使用技巧有很多,这里只是梳理了几个常用的以及我目前遇到过的,其他的技巧还没使用过,所以就没有列出来。 01|Tab键自动完成:在shell中输入表达式时,只要按下Tab键,当前命名空间中任何与已输入的字符串相…...
vue项目纯前端实现导出pdf文件
1、下载插件 npm install html2canvas npm install jspdf2、创建htmlToPdf.js,地址:src/utils/htmlToPdf.js import html2Canvas from html2Canvas import JsPDF from jspdf export default { install(Vue, options) { Vue.prototype.getPdfFromH…...
以Bert训练为例,测试torch不同的运行方式,并用torch.profile+HolisticTraceAnalysis分析性能瓶颈
以Bert训练为例,测试torch不同的运行方式,并用torch.profileHolisticTraceAnalysis分析性能瓶颈 1.参考链接:2.性能对比3.相关依赖或命令4.测试代码5.HolisticTraceAnalysis代码6.可视化A.优化前B.优化后 以Bert训练为例,测试torch不同的运行方式,并用torch.profileHolisticTra…...
地球地图:快速进行先进土地监测和气候评估的新工具Earth Map
地球地图:快速进行先进土地监测和气候评估的新工具 这个工具是居于GEE 开发的多功能的一个APP应用,主要进行土地监测和气候评估 Earth Map 什么是地球地图? 地球地图是联合国粮食及农业组织(粮农组织)在粮农组织与谷歌合作框架内开发的一个创新、免费和开放源码的工具。…...
6.22套题
B. Dark 题意:每次能在数列中能使相邻两个数-1,求当数列没有连续非0值的最小贡献 解法:设表示前i个数中前i-1个数是否为0,当前数是j的最小贡献。表示i1以后减掉d的最小贡献。 C. 幸运值 D. 凤凰院真凶...
openEuler搭建hadoop Standalone 模式
Standalone 升级软件安装常用软件关闭防火墙修改主机名和IP地址修改hosts配置文件下载jdk和hadoop并配置环境变量配置ssh免密钥登录修改配置文件初始化集群windows修改hosts文件测试 1、升级软件 yum -y update2、安装常用软件 yum -y install gcc gcc-c autoconf automake…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
