Maven中的(五种常用依赖范围)
Maven 定义了 五种常用依赖范围(scope),它们控制着:
- 哪些依赖会编译时参与
- 哪些依赖会打包进 WAR/JAR
- 哪些依赖会传递给其他模块
- 哪些依赖只在测试中才有效
Maven 常用的依赖范围(scope)
| scope | 编译需要 | 测试需要 | 运行需要 | 被传递给依赖项目 | 会被打包 |
|---|---|---|---|---|---|
compile | ✅ | ✅ | ✅ | ✅ | ✅ |
provided | ✅ | ✅ | ❌ | ✅ | ❌ |
runtime | ❌ | ✅ | ✅ | ✅ | ✅ |
test | ❌ | ✅ | ❌ | ❌ | ❌ |
system | ✅ | ✅ | ✅ | ❌ | ❌ |
1. compile(默认)
- 默认作用域,不写就是它
- 编译、测试、运行都需要
- 会被打包
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId>
</dependency>
2. provided
- 编译期需要,但运行时由容器提供
- 常用于:
servlet-api,jsp-api,spring-web(如果跑在 Tomcat、WebLogic 上) - 不会被打进最终包中
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.0</version><scope>provided</scope>
</dependency>
3. runtime
- 运行时才需要,编译期不需要
- 常用于:JDBC 驱动、日志实现(像 SLF4J 的具体实现)
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version><scope>runtime</scope>
</dependency>
4. test
- 只在测试编译和运行时才用
- 比如:JUnit、Mockito、Spring Test
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.2</version><scope>test</scope>
</dependency>
5. system(不推荐)
- 本地手动指定 jar 路径,不被 Maven 管理版本,也不会打进包
- 一般用于:一些特殊三方包,比如银行/政府/供应商给的 jar
<dependency><scope>system</scope><systemPath>${project.basedir}/lib/xxx.jar</systemPath>
</dependency>
总结一句话:
| 如果你… | 用这个 scope |
|---|---|
| 依赖要参与编译 & 打包 | compile(默认) |
| 容器会提供它(Tomcat/Web容器) | provided |
| 只运行时用(比如数据库驱动) | runtime |
| 单元测试用 | test |
| 特殊情况,要手动指定 JAR 路径 | system(不推荐) |
再详细一点:
现在我们就来讲讲这五个:compile、system、provided、runtime 和 test,他们各有定位。咱们逐个讲,简单实用地理解:
1. compile —— 默认的,也是最常用的
关键词:编译、运行、打包,我全包了!
适用场景:
- 项目的核心依赖,比如 Spring、MyBatis、Guava 等。
- 几乎所有你写业务逻辑需要直接引用的类库。
代码示例:
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.30</version>
</dependency>
(注意:不写 scope 默认就是 compile)
总结一句话:
👉 “无论编译、运行还是打包,我都在!”
2. provided —— 由“容器”提供,不打包
关键词:我用你编译,但不带你打包,因为你上线后会自动有!
典型场景:
- 在 Web 项目里用
javax.servlet-api编译,但部署到 Tomcat 时,Tomcat 自己就有这个 jar。 - Spring MVC 项目,Tomcat 提供 servlet/jsp 包,我们就不用打进去。
代码示例:
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.0</version><scope>provided</scope>
</dependency>
总结一句话:
👉 “我上线后会在服务器现成有,别打进包!”
3. runtime —— 只运行时用,编译时不需要
关键词:我不需要你编译,只要你运行时别掉链子就行!
典型场景:
- JDBC 驱动类,比如你写的是标准
javax.sql.DataSource接口,不需要依赖 mysql jar 编译。 - 日志实现类(比如 slf4j-api 是编译用的,logback 才是 runtime)。
代码示例:
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version><scope>runtime</scope>
</dependency>
总结一句话:
👉“我不参与编译,但运行缺我不行!”
4. test —— 只在测试中用,正式代码不碰我
关键词:我是测试工具,正式发布别带我!
典型场景:
- 单元测试:JUnit、Mockito、Spring Test
- 断言库:AssertJ、Hamcrest
代码示例:
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.2</version><scope>test</scope>
</dependency>
总结一句话:
👉 “我只在写测试用例的时候露个脸,正式发布我退下!”
5. system —— 本地 jar 手动引入,非标准做法
关键词:Maven 别管我,我自己手动来!
适用场景(非常罕见,尽量避免):
- 第三方 jar 没有发布到 Maven 仓库(比如厂商 SDK)
- 项目临时需要某些 jar(比如内部集成测试)
代码示例:
<dependency><groupId>com.example</groupId><artifactId>custom-sdk</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/custom-sdk.jar</systemPath>
</dependency>
⚠️ 缺点:
- 不能参与依赖传递(子项目无法用)
- 不能通过仓库管理,CI/CD 自动化难
- 不支持跨平台构建,容易踩坑
总结一句话:
👉 “我不上 Maven 仓,自己拎包来,后果自负!”
最后来个对比小口诀记住它们:
| 依赖范围 | 说明 |
|---|---|
compile | 编译运行都要,打包也要 |
provided | 编译要,运行容器给,不打包 |
runtime | 编译不需要,运行时必须,要打包 |
test | 只用于测试,不打包 |
system | 本地 jar,Maven 不管,不推荐 |
最终全表对比总结(收藏级):
| Scope | 编译 | 运行 | 测试 | 打包 | 是否推荐 | 用途简记 |
|---|---|---|---|---|---|---|
compile | ✅ | ✅ | ✅ | ✅ | ✅ | 常规依赖,最常用 |
provided | ✅ | ❌ | ✅ | ❌ | ✅ | 容器会提供(如 servlet) |
runtime | ❌ | ✅ | ✅ | ✅ | ✅ | 运行才需要(如 JDBC 驱动) |
test | ❌ | ❌ | ✅ | ❌ | ✅ | 测试专用(如 JUnit) |
system | ✅ | ✅ | ✅ | ✅ | ❌ | 非 Maven 管理(不推荐,慎用) |
相关文章:
Maven中的(五种常用依赖范围)
Maven 定义了 五种常用依赖范围(scope),它们控制着: 哪些依赖会编译时参与哪些依赖会打包进 WAR/JAR哪些依赖会传递给其他模块哪些依赖只在测试中才有效 Maven 常用的依赖范围(scope) scope编译需要测试需…...
Python内置函数-aiter()
Python内置函数 aiter() 用于获取异步可迭代对象的异步迭代器,是异步编程中的核心工具之一。 1. 基本概念 异步可迭代对象:实现了 __aiter__() 和 __anext__() 方法的对象,支持 async for 循环。 异步迭代器:通过 aiter() 获取的…...
面试篇:Java并发与多线程
基础概念 什么是线程?线程和进程的区别是什么? 线程 是程序执行的最小单位,它是 CPU 调度和执行的基本单元。一个进程可以包含多个线程,这些线程共享进程的资源(如内存),但每个线程有自己的栈…...
Windows 同步技术-计时器队列和内存屏障
计时器队列 CreateTimerQueue 函数为计时器创建队列。 此队列中的计时器(称为 计时器队列计时器)是轻量级对象,可用于指定要在指定到期时间到达时调用的回调函数。 等待作由 线程池中的线程执行。 若要将计时器添加到队列,请调用…...
基于无障碍跳过广告-基于节点跳过广告
2025-04-22 一些广告的关闭是叉图标,获取到的信息也没什么特征,这种广告怎么跳过 用autojs无障碍的节点定位ui控件位置,点击...
内存管理(Linux程序设计)
内存管理 目录 内存管理 一.简单的内存分配 代码功能概述 代码流程图 变量声明 动态内存分配 内存分配错误检查 向内存写入字符串 设置退出状态并退出程序 二.请求全部的物理内存 代码功能概述 变量声明 三..可用内存 四.滥用内存 1.代码功能(预期 …...
element-ui、element-plus表单resetFields()无效的坑
一、基本前提: 1、form组件上必须要有ref 2、form-item上必须要有prop属性 二、新增/编辑用一个el-dialog时,先新增再编辑没问题,先编辑再新增未清空 原因 在没有点新增或着编辑时,我的el-dialog弹出框里的内容是空白的&…...
LeetCode 252 会议室 III(Meeting Rooms III)题解与模拟面试
1. 引言 在现代办公和协作中,会议室的高效利用至关重要。LeetCode 252 题“会议室 III”要求我们在给定一组会议的时间区间后,计算同一时间段内需要开的最少会议室数量,以保证所有会议能顺利进行。本题不仅是经典的区间调度问题变形…...
基于HPC的气候模拟GPU加速实践全流程解析
基于HPC的气候模拟GPU加速实践全流程解析 关键词:气候模型、GPU加速、CUDA编程、性能优化、分布式训练 摘要: 本文针对全球气候模拟中10^12级网格点实时计算需求,提出基于CUDA的并行计算架构。通过改进WRF模式的分块矩阵乘法算法,…...
【CSS】层叠,优先级与继承(三):超详细继承知识点
目录 继承一、什么是继承?2.1 祖先元素2.2 默认继承/默认不继承 二、可继承属性2.1 字体相关属性2.2 文本相关属性2.3 列表相关属性 三、不可继承属性3.1 盒模型相关属性3.2 背景相关属性 四、属性初始值4.1 根元素4.2 属性的初始值4.3 得出结论 五、强制继承5.1 in…...
计算机视觉算法实现——救生衣穿戴状态智能识别
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 一、救生衣穿戴状态识别领域概述 水上安全一直是全球关注的重大问题,据世界卫生组…...
URI、URL与URN详解概念介绍
URI (Uniform Resource Identifier) URI是统一资源标识符,是用于标识互联网上资源的字符串。它是一个用于区分资源的通用标识符,可以标识任何资源,包括文档、图像、服务等。 URI的特点 提供了一种标准方法来标识资源是最广泛的资源标识概念,URL和URN都是URI的子集格式通常…...
Science Robotics 新型层级化架构实现250个机器人智能组队,“单点故障”系统仍可稳定运行
近期,比利时布鲁塞尔自由大学博士生朱炜煦与所在团队提出了一种创新的机器人群体架构——“自组织神经系统”(SoNS,Self-organizing Nervous System)。 它通过模仿自然界中的生物神经系统的组织原理,为机器人群体建立了…...
手写深拷贝函数
在 JavaScript 中,深拷贝是指创建一个对象或数组的完全独立副本,包括其嵌套的对象或数组。这意味着修改副本不会影响原始对象。 以下是手写一个通用的深拷贝函数的实现: 深拷贝函数实现 function deepClone(target, map new WeakMap()) {//…...
React 性能优化三剑客实战:告别无效重渲染!
在 Vue 中我们可能依赖 Vuex computed 进行状态共享和性能优化,而在 React 里呢?不需要用 Redux,靠 useContext、memo、useMemo 三剑客就能构建高性能组件通信方案! 🧩 useContext 再回顾:状态共享不等于性…...
深度学习3.3 线性回归的简洁实现
步骤操作作用前向计算net(X)计算预测值 y_hat Xw b损失计算loss(y_hat, y)量化预测误差,驱动参数更新反向传播l.backward()计算参数梯度参数更新trainer.step()根据梯度调整参数,逼近最优解梯度清零trainer.zero_grad()防止梯度累积(必须放…...
复盘20250422
深度分析及个股推荐 1. 行业前景与个股逻辑梳理 从提供的股票信息来看,主要涉及以下行业:合成尼古丁(电子烟)、化工、跨境支付、跨境电商、农药、食品饮料、光刻机、电子商务、造纸等。需结合行业景气度、政策支持、公司核心竞争…...
从零开始学习MySQL的系统学习大纲
文章目录 前言第一阶段:数据库与 MySQL 基础认知数据库基础概念MySQL 简介 第二阶段:MySQL 安装与环境搭建安装前的准备MySQL 安装过程安装后的配置 第三阶段:SQL 基础语法SQL 概述数据库操作数据表操作数据操作 第四阶段:SQL 高级…...
APP动态交互原型实例|墨刀变量控制+条件判断教程
引言 不同行业的产品经理在绘制原型图时,拥有不同的呈现方式。对于第三方软件技术服务公司的产品经理来说,高保真动态交互原型不仅可以在开发前验证交互逻辑,还能为甲方客户带来更直观、真实的体验。 本文第三部分将分享一个实战案例&#…...
基于控制台的小车导航游戏开发详解(C++实现)
本文将详细讲解一个基于C控制台的小车导航游戏项目。通过该项目可以学习二维数组操作、队列数据结构应用以及游戏循环控制等核心编程概念,特别适合刚接触游戏开发的初学者学习。 一、项目概述 1.1 游戏规则 玩家可创建多辆具有不同初始位置和移动速度的小车 每辆…...
色谱图QCPColorMap
一、QCPColorMap 概述 QCPColorMap 是 QCustomPlot 中用于绘制二维颜色图的类,可以将矩阵数据可视化为颜色图(热力图),支持自定义色标和插值方式。 二、主要属性 属性类型描述dataQCPColorMapData存储颜色图数据的对象interpol…...
大文件分片上传进阶版(新增md5校验、上传进度展示、并行控制,智能分片、加密上传、断点续传、自动重试),实现四位一体的网络感知型大文件传输系统
上篇文章我们总结了大文件分片上传的主要核心,但是我对md5校验和上传进度展示这块也比较感兴趣,所以在deepseek的帮助下,扩展了一下我们的代码,如果有任何问题和想法,非常欢迎大家在评论区与我交流,我需要学…...
oracle不同数据库版本的自增序列
-- 查看数据库版本 SELECT * FROM v$version WHERE banner LIKE Oracle%; 1. Oracle 12c及以上版本支持 id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) PRIMARY KEY, -- 语法 id NUMBER GENER…...
【KWDB创作者计划】_针对KWDB时序数据库(多副本集群环境)进行压力测试
【KWDB创作者计划】_针对KWDB时序数据库(多副本集群环境)进行压力测试 1. 概述2. 压测环境部署3. 生成测试数据4. 写入性能测试5. 查询性能测试7. 总结 1. 概述 KaiwuDB分布式多模数据库从物联网场景真实需求出发,针对性设计多模架构。物联网…...
极狐GitLab 自定义实例级项目模板功能介绍
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 自定义实例级项目模板 (PREMIUM SELF) 极狐GitLab 管理员可以将群组设置为在实例上创建新项目时可选择的项目模板的来源。然…...
最新扣子(Coze)案例教程:飞书多维表格按条件筛选记录 + 读取分页Coze工作流,无限循环使用方法,手把手教学,完全免费教程
大家好,我是斜杠君。 👨💻 星球群里有同学想学习一下飞书多维表格的使用方法,关于如何通过按条件筛选飞书多维表格中的记录,以及如何使用分页解决最多一次只能读取500条的限制问题。 斜杠君今天就带大家一起搭建一…...
第八天 AI开发:NavMesh导航系统 对话系统:使用ScriptableObject存储对话数据 存档系统:JSON序列化保存数据
一、智能导航系统:NavMesh实战指南 1.1 导航网格基础配置 在Unity编辑器中: 选择场景中的静态物体勾选Navigation Static属性打开Window > AI > Navigation窗口 烘焙参数设置: NavMeshBuildSettings settings NavMesh.GetSettingsBy…...
Spring AI Alibaba-02-多轮对话记忆、持久化消息记录
Spring AI Alibaba-02-多轮对话记忆、持久化消息记录 Lison <dreamlison163.com>, v1.0.0, 2025.04.19 文章目录 Spring AI Alibaba-02-多轮对话记忆、持久化消息记录多轮对话对话持久-Redis 本次主要聚焦于多轮对话功能的实现,后续会逐步增加更多实用内容&…...
联邦元学习实现个性化物联网的框架
随着数据安全和隐私保护相关法律法规的出台,需要直接在中央服务器上收集和处理数据的集中式解决方案,对于个性化物联网而言,训练各种特定领域场景的人工智能模型已变得不切实际。基于此,中山大学,南洋理工大学…...
做虚拟化应该怎么选择美国服务器?
选择适合做虚拟化的美国服务器,需要综合考虑硬件性能、网络质量、稳定性、价格和服务支持等多个方面。以下是详细的选购指南,适合准备搭建VPS、虚拟主机、分销业务、开发测试环境、容器集群等用途的用户参考。 一、为什么美国服务器适合虚拟化? 美国机房…...
