maven scope 详解

【Maven】-- Maven Scope 详解 Scope编译(Compile)测试(Test)运行(Runtime)典型使用场景compile(默认)✅✅✅普通依赖,如 Apache Commonsprovided✅✅❌运行环境提供的库,如runtime❌✅✅运行时才需要的库,如test❌✅❌测试框架,如 JUnitsystem✅✅✅本地 jar,如商业库(不推荐)import❌❌❌仅用于。 阅读详情

Maven 的 scope用于定义依赖项在项目构建生命周期中的可见性和传递性,控制依赖在编译、测试、运行等阶段的可用性及是否被打包到最终产物中。以下是详细解析:


⚙️ ​​一、Scope 的核心作用​​

  1. ​​生命周期控制​​

    决定依赖在编译、测试、运行阶段的可用性。

  2. ​​依赖传递性​​

    影响依赖是否传递给下游模块(如多模块项目)。

  3. ​​构建优化​​

    避免冗余依赖,减少构建产物大小和潜在冲突。

📌 ​​二、Scope 分类详解​​

1. ​​compile(默认)​​
  • ​​可用阶段​​:编译、测试、运行、打包

  • ​​传递性​​:传递到下游模块。•

  • ​​场景​​:核心业务依赖(如 Spring、Jackson)。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.10</version>
    <!-- 默认 compile,可省略 -->
</dependency>
2. ​​provided​​
  • ​​可用阶段​​:编译、测试,​​运行时由外部提供​​(如 Tomcat)

  • ​​传递性​​:不传递到下游模块。

  • ​​场景​​:容器提供的依赖(如 Servlet API)。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
3. ​​runtime​​
  • ​​可用阶段​​:测试、运行,​​编译不可用​​

  • ​​传递性​​:传递到下游模块(下游为 runtime范围)。

  • ​​场景​​:运行时才加载的依赖(如 JDBC 驱动)。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
    <scope>runtime</scope>
</dependency>
4. ​​test​​
  • ​​可用阶段​​:仅测试(编译测试代码、运行测试)

  • ​​传递性​​:不传递到下游模块。

  • ​​场景​​:测试框架(如 JUnit、Mockito)。

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.9.3</version>
    <scope>test</scope>
</dependency>
5. ​​system(不推荐)​​
  • ​​可用阶段​​:编译、测试,需手动指定本地路径

  • ​​传递性​​:不传递到下游模块。

  • ​​风险​​:破坏 Maven 可移植性(依赖本地文件路径)。

<dependency>
    <groupId>com.example</groupId>
    <artifactId>custom-lib</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/libs/custom-lib.jar</systemPath>
</dependency>
6. ​​import(仅用于 BOM 管理)​​
  • ​​作用​​:在 <dependencyManagement>中导入其他 POM 的依赖配置,统一版本管理

  • ​​示例​​:导入 Spring Boot BOM。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.1.4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

🔄 ​​三、Scope 的传递性规则​​

​​依赖范围​​

​​传递到下游的 Scope​​

​​示例​​

compile

compile(下游直接依赖)

A → B(compile)→ C(compile)

runtime

runtime(下游运行时依赖)

A → B(runtime)→ C(runtime)

test/provided

​​不传递​​

下游需显式声明依赖

📌 ​​依赖冲突解决​​:

  • ​​就近原则​​:直接依赖优先级高于间接依赖。

  • ​​排除依赖​​:用 <exclusions>移除冲突版本

<dependency>
    <groupId>org.example</groupId>
    <artifactId>example-lib</artifactId>
    <exclusions>
        <exclusion>
            <groupId>conflict-group</groupId>
            <artifactId>conflict-artifact</artifactId>
        </exclusion>
    </exclusions>
</dependency>

🛠️ ​​四、实际应用场景​​

  1. ​​Web 项目​​

    • ​​provided​​:Servlet API(避免与 Tomcat 内置库冲突)。

    • ​​runtime​​:数据库驱动(编译无需,运行需加载)

  2. ​​多模块项目​​

    • 公共模块用 provided或 optional控制依赖传递,避免强制下游引入

  3. ​​依赖管理​​

    • 通过 import导入 BOM,统一版本(如 Spring Cloud、JavaEE)


❓ ​​五、常见问题​​

  1. ​​provided vs optional​​

    1. provided​​:运行环境提供,不打包。

    2. optional​​:标记为可选,阻止传递依赖(下游可显式引入)

  2. ​运行时 ClassNotFoundException​​

    原因:provided依赖未由容器提供,或 runtime依赖未正确打包。
  3. ​​何时用 system​

    尽量避免!改用私有仓库或 mvn install安装本地依赖

💎 ​​六、最佳实践总结​​

  • ​​默认​​:无特殊需求用 compile。

  • ​​容器依赖​​:provided(Servlet API 等)。

  • ​​运行时加载​​:runtime(JDBC 驱动)。

  • ​​测试隔离​​:test(JUnit)。

  • ​​依赖管理​​:import(BOM 导入)。

  • ​​🚫 避免​​:system(破坏可移植性)。

通过合理配置 scope,可显著提升构建效率、减少冲突,并确保依赖在正确阶段生效。更多细节可参考:Maven 官方文档

maven scope 的作用 一: 1.Maven中的依赖作用范围概述 Maven中使用 scope 来指定当前包的依赖范围和依赖的传递性。常见的可选值有:compile, provided, runtime, test, system 等。scope 主要是用在 pom.xml 文件中的依赖定义部分,例如: &lt;dependency&gt; &lt;groupId&gt;o... 阅读详情

相关推荐

电赛控制组入门到实战:从电路板到PID算法的完整路径

本文详细介绍了电赛控制组从电路板制作到PID算法实战的完整学习路径。涵盖嘉立创电路设计、Keil5开发环境搭建、STM32F103C8T6核心板外设应用,重点解析PID算法在电机速度环与位置环中的调试技巧,并探讨OpenMV视觉模块与主控制器的协同工作,为电赛参赛者提供系统化的实战指南。

oauth7security的博客 745

Maven中scope(作用范围)详解

一篇文章彻彻底底的掌握maven当中的依赖关系,以及scope作用范围。

怪咖@的博客 2万+

Chapter 4 Ripple-Based Control Technique Part I

本文介绍了DC-DC转换器的纹波控制技术,重点分析了迟滞控制、恒定开通时间控制、恒定关断时间控制等方案的工作原理及优缺点。纹波控制无需补偿网络,具有快速瞬态响应和结构简单的优势,特别适合电池供电应用。其中,恒定开通时间控制在轻载时能自动延长关断时间,实现伪定频工作;而恒定关断时间控制轻载效率较低。文章还讨论了纹波注入技术解决Boost转换器右半平面零点问题,并比较了不同控制方案在负载瞬态下的性能表现。最后指出基于纹波的控制技术在提高调节精度和降低EMI方面的改进方向。

2304_76736886的博客 1300

Maven的scope详解

https://www.pianshen.com/article/90681857024/ https://www.liaoxuefeng.com/wiki/1252599548343744/1309301178105890 https://www.cnblogs.com/sanshisiniao/articles/12068847.html https://www.cnblogs.com/tuyang1129/p/10741558.html https://blog.youkuaiyun.com/seasonsbin

liaowenxiong的博客 3万+

汇川PLC程序框架设计:模块化分层与标准化实践指南

在工业自动化领域,可编程逻辑控制器(PLC)是设备控制的核心大脑。其编程质量直接决定了系统的稳定性、可维护性与开发效率。遵循高内聚、低耦合的软件工程原则,通过模块化分层设计,能够将复杂的控制逻辑分解为硬件驱动、设备控制、流程管理等清晰层级,并利用功能块(FB)封装可复用的设备控制逻辑。这种结构化方法的技术价值在于大幅提升代码的可读性、可测试性与团队协作效率,有效降低后期维护与功能迭代的难度。其应用场景广泛覆盖从单机设备到复杂产线的自动化项目。本文聚焦于汇川PLC平台,深入探讨如何构建一套融合了**状态机编程

weixin_29188997的博客 400

攻防世界:Crypto习题之easy_RSA

在非对称加密算法中,单向函数被广泛应用,用于确保从公钥加密后的密文无法轻易推导出私钥,从而保证数据的安全性。而其中最著名的算法便是 RSA 加密算法。首先设φm:=∣1≤k≤mgcdkm1∣为欧拉函数(Euler’sche Phi-function)。pqn:=pqpqφnnpqpqφnp−1q−1e∈12...φn−1gcdφne1ended≡1φn假设我们现在有明文x以及公钥en。

qq_52789488的博客 1570

Maven中scope标签详解

- compile:编译、测试、打包、运行 - test:测试代码编译、运行 - runtime:测试、打包、运行 - provided:编译、测试 - system:编译、测试,用于导入第三方Jar文件 - import:用于dependencyManagement,从其它的pom中导入dependency的配置 ............

weixin_40017062的博客 1万+

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1218

Maven中的scope总结

Maven中的scope主要有以下6种,接下来分别介绍下这几种scope: compile 不声明scope元素的情况下的默认值;compile表示被依赖包需要参与当前项目的编译,包括后续的测试,运行周期也参与其中,是一个比较强的依赖;打包的时候通常需要包含进去。 provided provided 类型的scope只会在项目的编译、测试阶段起作用;可以认为在目标容器中已经提供了这个依赖,无需在提供,但是在编写代码或者编译时可能会用到这个依赖;依赖不会被打入到项目jar包中。 runtime runtim

qgnczmnmn的博客 3万+

【QT/C++】事件过滤器之基于重写 eventFilter 方法的多种常见应用场景及实现

Qt事件过滤器通过重写eventFilter方法实现多种实用功能:1)鼠标事件处理(点击全选文本、禁用滚轮、悬停提示);2)键盘事件处理(输入内容限制、快捷键提交);3)焦点事件处理(自动弹出下拉框、实时验证);4)绘图事件处理(自定义控件绘制);5)窗口事件处理(防止意外关闭、尺寸限制)。事件过滤器提供非侵入式的事件处理方案,相比传统子类化方式更灵活,通过installEventFilter安装到目标控件即可实现各种交互增强功能。

yuhuasheng1997的博客 1483

12、信号采样与Z变换的全面解析

本文全面解析了信号采样和Z变换的核心概念与应用。内容涵盖采样基础、采样频率与奈奎斯特率的关系、离散时间处理模拟信号的方法、采样率转换技术,以及Z变换的定义、性质、常见变换对和逆变换计算。通过实例分析和流程图展示,帮助读者深入理解数字信号处理的关键步骤,为相关领域的学习与应用打下坚实基础。

Jerry的专栏 118

maven之scope

在 Maven 中,scope定义了依赖的可见性和生存周期,主要影响依赖在编译、测试和运行阶段的可用性,以及是否传递给下游模块。以下是 Maven 中常用的scope。

阿呆的专栏 1040

16、树莓派Pico W:蓝牙与Wi-Fi应用指南

本文介绍了树莓派Pico W在蓝牙与Wi-Fi通信方面的应用,涵盖蓝牙配对原理、使用HC-06模块实现手机远程控制LED和传输内部温度,以及通过Wi-Fi进行网络连接、扫描和UDP协议下的设备控制。文章包含详细电路连接、代码实现与测试步骤,并提供拓展建议、常见问题解决方法及开发注意事项,帮助读者快速掌握基于Pico W的无线通信项目开发,适用于物联网入门与实践场景。

sun99的博客 289

Maven Scope 讲解

依赖的Scope scope定义了类包在项目的使用阶段。项目阶段包括: 编译,运行,测试和发布。 分类说明 compile 默认scope为compile,表示为当前依赖参与项目的编译、测试和运行阶段,属于强依赖。打包之时,会达到包里去。 test 该依赖仅仅参与测试相关的内容,包括测试用例的编译和执行,比如定性的Junit。 runtime 依赖仅参与运行周期中的使用。一般这种类库都是接口与实现...

lixuanfeng blog 4209

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

maven中scope标签详解

前言 最近在做itoo的pom优化工作,发现对于maven依赖管理中的scope标签还是有不明白的地方,所以今天就来总结一下这方面的知识,scope在maven的依赖管理中主要负责项目的部署 maven的哲学在上次技术分享的时候也提到了:约定大于配置,所以在maven中,很多内容都有默认值,scope的默认值是compile,那么scope还能有哪些选项呢? scope的分类 1.compil...

莫等闲的博客 297

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Maven的依赖Scope详细解释

Maven 是 Java 开发中最常用的构建工具之一。它的强大之处在于提供了简洁有效的依赖管理。我们在使用 Maven 时,不仅能指定依赖库,还可以灵活地控制这些依赖在项目的不同生命周期中的可见性和使用方式。这种控制通过 **scope** 实现。理解 Maven 的依赖范围,可以帮助我们更好地优化项目的大小、提高性能,并确保在正确的环境下加载所需的依赖。

常备不懈 1959

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

maven详解scope

maven的scope相信很多人都有些迷糊 问题1:scope在哪里? 问题2:scope是什么? 问题3:scope怎么用? 我们来一一解答这些问题。 1.scope在哪里? 我们都知道,dependency里面有三个元素:g,a,v(groupID,artifactID,version) 其实dependency里面还有几个其它的元素。 其中有一个就是scope ...

Buggggggg 801

Maven的Scope区别笔记

依赖的Scope scope定义了类包在项目的使用阶段。项目阶段包括: 编译,运行,测试和发布。 分类说明 compile 默认scope为compile,表示为当前依赖参与项目的编译、测试和运行阶段,属于强依赖。打包之时,会达到包里去。 test 该依赖仅仅参与测试相关的内容,包括测试用例的编译和执行,比如定性的Junit。 runtime 依赖仅参与运行周期中的使用。一般...

木小鱼的笔记 4万+

maven中强大的scope标签详解

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

凌大大的博客 9494

Maven依赖中的scope详解

Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中,scope的默认值是compile,项目中经常傻傻的分不清,直接默认了。今天梳理一下maven的scope。 scope的分类 compile 默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译...

ncc1995的博客 306

Maven 依赖中 scope 详解

前言 Maven 的哲学思想是,约定优于配置(Convention Over Configuration),Maven 依赖中 scope 的默认值是compile Scope 指定了依赖(第三方jar包)的 作用范围 作用范围包括,所在项目的测试、编译、运行、打包等生命周期 其中,编译和运行还分为 测试代码的编译和运行 非测试代码的编译和运行 scope 分类 t...

想好了就去做吧 即便失败了 至少这条路上留下了你的脚印 583

Maven的Scope

依赖的Scope scope定义了类包在项目的使用阶段。项目阶段包括: 编译,运行,测试和发布。 分类说明 compile 默认scope为compile,表示为当前依赖参与项目的编译、测试和运行阶段,属于强依赖。打包之时,会达到包里去。 test 该依赖仅仅参与测试相关的内容,包括测试用例的编译和执行,比如定性的Junit。 runtime 依赖仅参与运行周期中的使用。一般这种类库都是接口...

whymoney1000的博客 232

Maven scope与 Gradle scope

Maven与Gradle依赖项scope Maven和Gradle对依赖项的scope有所不同。在Maven世界中,一个依赖项有6种scope而gradle的scope 一直在优化调整优化。 maven scope属性 依赖范围控制哪些依赖在哪些classpath 中可用,哪些依赖包含在一个应用中。 compile (编译) compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath中可用,同时它们也会被打包。 provided (已提供)

herionZhang的博客 3528

踩坑记录:Maven的scope属性

maven中正常引入了hutool工具包,SpringBoot类启动时无异常,但在某个类中执行main方式时报错ClassNotFoundException。

开卷有害 1370

maven的scope作用域

maven作为比较流程的java项目依赖管理,对java开发者来讲dependency的scope标签并不罕见,例如我们经常会在项目的pom文件中看到类似这样的写法: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test&lt

霜之哀伤 1639
上一篇: spring-boot-test与 spring-boot-starter-test 区别
下一篇: Spring Boot 3.5.3 集成 Log4j2 日志系统
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰望星空@脚踏实地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值