【Maven】-- Maven Scope 详解

embedded/2025/2/27 18:15:23/

目录

Maven Scope 详解

1. 引言

2. Maven 依赖范围(Scope)分类

2.1 compile(默认范围)

2.2 provided

2.3 runtime

2.4 test

2.5 system

2.6 import(仅用于 dependencyManagement)

3. Scope 作用范围总结

4. 结论


Maven Scope 详解

1. 引言

Maven 是 Java 项目构建和依赖管理的标准工具。在使用 Maven 进行依赖管理时,scope(作用范围)是一个重要的概念。Maven scope 决定了依赖项在编译、测试、运行等不同阶段的可用性。

本文将详细介绍 Maven 中的各种 scope 及其适用场景。


2. Maven 依赖范围(Scope)分类

Maven 主要提供以下几种 scope

2.1 compile(默认范围)

特点:

  • 依赖项在编译测试运行阶段均可用。
  • 这是 Maven 依赖的默认范围,如果未指定 scope,则默认使用 compile

适用场景:

  • 适用于编译期必须使用的依赖,例如 javax.servlet-api(如果是 web 应用)。

示例:

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version><scope>compile</scope>
</dependency>

2.2 provided

特点:

  • 依赖项在编译测试阶段可用,但在运行时不可用。
  • 适用于那些在运行时由容器或 JDK 提供的依赖。

适用场景:

  • 适用于 Web 项目中的 javax.servlet-api,因为它在运行时由 Tomcat 或其他服务器提供。
  • 适用于使用 JDK 自带库(如 tools.jar)的情况。

示例:

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>

2.3 runtime

特点:

  • 依赖项在测试运行阶段可用,但在编译时不可用。
  • 适用于那些只在运行时才需要的依赖。

适用场景:

  • 适用于 JDBC 驱动,如 mysql-connector-java,因为编译时通常不需要它,但运行时必须可用。

示例:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version><scope>runtime</scope>
</dependency>

2.4 test

特点:

  • 依赖项仅在测试阶段可用,不会参与编译和运行。
  • 适用于单元测试框架或测试相关工具。

适用场景:

  • 适用于 JUnit、Mockito 等测试框架。

示例:

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope>
</dependency>

2.5 system

特点:

  • 类似于 provided,但依赖项必须通过 systemPath 指定本地路径
  • 这种方式不建议使用,因为它破坏了 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>

注意system 依赖不会从 Maven 仓库解析,建议尽量避免使用。


2.6 import(仅用于 dependencyManagement)

特点:

  • 仅用于 dependencyManagement 中,允许引入 BOM(Bill of Materials)。
  • 这种方式用于管理多个依赖的版本,而不会真正引入依赖。

适用场景:

  • 适用于 Spring Boot 等项目中引入官方 BOM。

示例:

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

3. Scope 作用范围总结

Scope编译(Compile)测试(Test)运行(Runtime)典型使用场景
compile(默认)普通依赖,如 Apache Commons
provided运行环境提供的库,如 javax.servlet-api
runtime运行时才需要的库,如 mysql-connector-java
test测试框架,如 JUnit
system本地 jar,如商业库(不推荐)
import仅用于 dependencyManagement

4. 结论

Maven scope 的选择对项目的构建和运行至关重要。合理使用 scope,可以优化项目的依赖管理,提高构建效率。

  • 如果不确定,默认使用 compile
  • 如果依赖运行时由外部提供(如 Web 容器),使用 provided
  • 如果依赖仅在运行时使用,使用 runtime
  • 如果依赖仅用于测试,使用 test
  • 避免使用 system,优先使用远程仓库
  • 使用 import 来管理 BOM,保持依赖版本一致

希望本文能帮助你更好地理解 Maven 依赖范围的用法!


http://www.ppmy.cn/embedded/167594.html

相关文章

MySQL--》如何在MySQL中打造高效优化索引

目录 初识索引 索引结构 性能分析 索引使用 最左前缀法则 SQL提示使用 覆盖索引使用 前缀索引使用 索引失效情况 初识索引 索引(index)&#xff1a;是帮助MySQL高效获取数据的数据结构(有序)&#xff0c;在数据之外数据库系统还维护着满足特定查找算法的数据结构&…

最小化重投影误差求解PnP

问题描述 已知n个空间点 P i [ x i , y i , z i ] T P_i[x_i,y_i,z_i]^T Pi​[xi​,yi​,zi​]T&#xff0c;其投影的像素坐标 p i [ u i , v i ] T p_i[u_i,v_i]^T pi​[ui​,vi​]T求相机的位姿R&#xff0c;T。 问题分析 根据相机模型&#xff0c;像素点和空间点的位置…

Node.js v16 版本安装

查看自己电脑上有没有node.js 1.打开命令提示符或终端窗口(windows上是cmd,macOS和Linux上是终端)。 2.在命令提示符或终端窗口中输入以下命令&#xff1a;node -v 3.如果你已经安装了Node.js,你将看到一个版本号&#xff0c;例如v14.15.4。 4.如果你看到一个错误消息或者什么…

12个大语言模型平台对比测试-搜索视角

这里写自定义目录标题 1 背景1.1 简单问题设置1.2 答案标准 2 常见大语言模型平台回答表现2.1 ChatGPT-o3-mini2.2 Grok-Grok 3联网2.3 perplexity-pro2.4 通义-Qwen2.5深度搜索2.5 智普清言-GLM 4 Plus2.6 deepseek R1联网2.7 Kimi-k1.5长思考联网2.8 秘塔-R1联网2.9 纳米AI-R…

MySQL 中如何查看 SQL 的执行计划?

SQL 语句前面使用 EXPLAIN 关键字&#xff1a; EXPLAIN SELECT * FROM users WHERE id 1; 字段 含义 id 查询的序号&#xff08;如果是子查询或联合查询&#xff0c;会有多个 id&#xff09;。 select_type 查询的类型&#xff08;简单查询、子查询、联合查询等&#xff…

模型压缩、量化、剪枝等技术减小模型体积,降低计算复杂度

在深度学习领域&#xff0c;模型压缩、量化和剪枝等技术是减小模型体积、降低计算复杂度的有效手段&#xff0c;以下为你详细介绍这些技术&#xff1a; 模型压缩 原理 模型压缩旨在通过各种方法减少模型的参数数量和计算量&#xff0c;同时尽可能保持模型的性能。其核心思想…

VUE向外暴露文件,并通过本地接口调用获取,前端自己生成接口获取public目录里面的文件

VUE中&#xff0c;如果我们想对外暴露一个文件&#xff0c;可以在打包之后也能事实对其进行替换&#xff0c;我们只需要把相关文件放置在public目录下即可&#xff0c;可以放置JSON&#xff0c;Excel等文件 比如我在这里放置一个other文件 我们可以直接在VUE中使用axios去获取…

VIP商品页面结构经常变化怎么办?

在爬取VIP商品详情时&#xff0c;页面结构的频繁变化是常见的挑战。为了应对这一问题&#xff0c;可以采取以下策略&#xff1a; 1. 使用稳定的选择器 在编写爬虫时&#xff0c;尽量选择更通用、更稳定的CSS选择器或XPath表达式&#xff0c;避免依赖于容易变化的元素属性。例…