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 官方文档

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

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

相关文章

Python的一次实际应用:利用Python操作Word文档的页码

Python的一次实际应用&#xff1a;利用Python操作Word文档的页码 需求&#xff1a;一次性处理24个文档的页码。 文档详情&#xff1a; 1、每个word文档包含800页左右&#xff0c;每一页包含一个标题和一张图片。 2、由于图片有横排也有竖排&#xff0c;因此&#xff0c;每页文档…

Android15 GKI版本分析Kernel Crash问题

环境介绍编译主机&#xff1a;amd64 Ubuntu 22.04Android源码&#xff1a;Android15 GKIKernel版本&#xff1a;Linux 6.16Android构建系统&#xff1a;bazel构建工具链&#xff1a;gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-定位Linux…

rocky 9部署Zabbix监控

一、rocky安装 需要注意在设置root用户密码时&#xff0c;勾选ssh远程连接 安装完成后直接用root登录 1. 网络配置 输入nmtui 进入网络配置界面 选择 Edit a connection&#xff0c;再选择接口 ens3 IPV4更改为Maual 手动模式 根据实际环境配置IP地址 重启网络 systemctl …

从9.4%到13.5%:ICDM2025录取率触底反弹,竞争压力稍缓

近日&#xff0c;ICDM 2025公布了论文录用结果。本次大会共收到785篇有效论文投稿&#xff0c;最终&#xff0c;共有106篇常规论文和70篇短论文被接收&#xff0c;总体接收率为22.4%&#xff0c;其中全文论文的接收率为13.5%。与前年9.4%、去年11.09%的录取率相比&#xff0c;I…

linux上安装methylkit -- 安全下车版 (正经版: Linux环境下安装methylKit的实践与避坑指南)

题外话&#xff1a; 我踩过的坑&#xff0c;都将成为我写贴的素材&#xff01;(ㄒoㄒ) 整整安装了两天&#xff0c;这里面的滋味懂的都懂。 希望开发作者持续维护。 希望有人或者作者持续打包成sigularity镜像使用&#xff0c;并且直接传到github上&#xff0c;传到docker上下…

【leetcode】114. 二叉树展开为链表

文章目录题目题解1. 递归2. 迭代3. 右指针重排&#xff0c;始终将右子树添加到左子树的最右题目 114. 二叉树展开为链表 题解 1. 递归 先序遍历然后将数组操作 for i in range(1, len(res)):prev, curr res[i - 1], res[i]prev.left Noneprev.right curr# Definition fo…

Vibe Coding、AI IDE/插件

概述 Vibe Coding&#xff0c;氛围编程&#xff0c;AI辅助编程&#xff0c;三剑客&#xff1a; Google Gemini&#xff1a;OpenAI GPT&#xff1a;Anthropic Claude&#xff1a; IDE Cursor 基于VS Code开发。 特性&#xff1a; AI驱动的代码生成&#xff1a;输入想要的…

Unity高级UI拖动控制器教程

在游戏开发过程中&#xff0c;UI组件的拖动功能是一个常见的需求。特别是在需要实现拖动、边界检测、透明度控制以及动画反馈等功能时&#xff0c;编写一个高级UI拖动控制器将非常有用。在本文中&#xff0c;我们将创建一个支持多种Canvas模式和更精确边界检测的高级UI拖动控制…

零基础上手:Cursor + MCP 爬取 YouTube 视频数据

前言 大模型与 AI 应用越来越普及的今天&#xff0c;实时、稳定地获取网络数据变得尤为重要。无论是做内容分析、趋势研究还是自动化任务&#xff0c;爬取和处理数据始终是绕不开的一环。 传统爬虫往往面临封禁、验证码、动态渲染等难题&#xff0c;而 Bright Data MCP&#x…

frp 一个高性能的反向代理服务

文章目录项目概述核心特性系统架构快速开始1. 下载安装2. 服务端快速配置3. 客户端快速配置4. 验证连接配置文件说明代理类型TCP/UDP 代理HTTP/HTTPS 代理安全代理 (STCP/SUDP)P2P 代理 (XTCP)插件系统静态文件服务HTTP/SOCKS5 代理协议转换使用场景远程办公Web 服务发布游戏服…

Android -第二十一次技术总结

一、activity与Fragment的通信有哪些&#xff1f;使用接口进行通信的逻辑与代码示例使用接口通信的核心是解耦&#xff0c;通过定义一个接口作为通信契约&#xff0c;让 Fragment 不依赖于具体的 Activity 类型。1. 定义通信接口&#xff08;在 Fragment 内&#xff09;首先&am…

【算法】78.子集--通俗讲解

通俗易懂讲解“子集”算法题目 一、题目是啥?一句话说清 给你一个不含重复元素的整数数组,返回所有可能的子集(包括空集和它本身)。 示例: 输入:nums = [1,2,3] 输出:[[], [1], [2], [1,2], [3], [1,3], [2,3], [1,2,3]] 二、解题核心 使用回溯法(递归)或位运算来…

Cherrystudio的搭建和使用

1、下载和安装 Cherry Studio 官方网站 - 全能的 AI 助手 2、配置LLM 3、聊天助手 3.1 添加和编辑助手 3.2 选择LLM 3.3 对话聊天 4、配置MCP 4.1 安装MCP执行插件 4.2 安装 node和npm Node.js — Download Node.js npm -v 10.9.3 node -v v22…

基于Matlab结合肤色检测与卷积神经网络的人脸识别方法研究

近年来&#xff0c;随着人工智能与计算机视觉技术的发展&#xff0c;人脸识别在人机交互、安防监控、身份认证等领域得到了广泛应用。本文提出了一种基于 MATLAB 平台&#xff0c;结合 肤色检测与卷积神经网络&#xff08;CNN&#xff09; 的人脸识别方法。该方法首先利用肤色模…

在八月点燃AI智慧之火:CSDN创作之星挑战赛开启灵感盛宴

在八月点燃AI智慧之火&#xff1a;CSDN创作之星挑战赛开启灵感盛宴八月骄阳似火&#xff0c;智能时代的技术热情同样炽热。在这个充满创新活力的季节&#xff0c;「AIcoding八月创作之星挑战赛」正式拉开帷幕&#xff0c;为CSDN的创作者们打造一个展示才华、碰撞灵感的专业舞台…

解密 Vue 3 shallowRef:浅层响应式 vs 深度响应式的性能对决

&#x1f4d6; 概述 shallowRef() 是 Vue 3 中的一个组合式 API 函数&#xff0c;用于创建浅层响应式引用。与 ref() 不同&#xff0c;shallowRef() 只在其 .value 被直接替换时触发响应式更新&#xff0c;不会深度监听对象内部属性的变化。 &#x1f3af; 基本概念 什么是 sh…

Linux进程间通信(IPC)深入解析

Linux进程间通信&#xff08;IPC&#xff09;深入解析 1 概述 Linux 进程间通信 (Inter-Process Communication, IPC) 是不同进程之间交换数据与同步操作的机制。现代 Linux 内核提供了多种 IPC 方式&#xff0c;从传统的管道和 System V IPC 到现代的套接字和 D-Bus&#xff0…

TensorFlow-GPU版本安装

前言&#xff1a; &#xff08;1&#xff09;因项目需求&#xff0c;需要安装TensorFlow-GPU版本&#xff0c;故本文在此记录安装过程。 &#xff08;2&#xff09;有注释&#xff0c;优先看注释 &#xff08;3&#xff09;本文所使用的GPU为NVIDIA GeForce RTX 5080 Laptop GP…

Elasticsearch 索引字段删除,除了 Reindex 重建索引还有没有别的解决方案?

unsetunset1、问题来源unsetunset在生产环境维护 Elasticsearch 集群的过程中&#xff0c;经常会遇到这样的场景&#xff1a;业务需求变更导致某些字段不再使用&#xff0c;或者早期设计时添加了一些冗余字段&#xff0c;现在需要清理掉。最近球友在公司的一个项目中就遇到了这…

Ubuntu虚拟机磁盘空间扩展指南

这是一份详细且易于理解的 Ubuntu 虚拟机磁盘空间扩展指南。本指南涵盖了两种主流虚拟机软件&#xff08;VirtualBox 和 VMware&#xff09;的操作步骤&#xff0c;并分为 “扩展虚拟磁盘” 和 “在 Ubuntu 内部分配新空间” 两大部分。重要提示&#xff1a;在进行任何磁盘操作…