【Maven】-- Maven Scope 详解

ops/2025/2/27 15:57:03/

目录

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/ops/161715.html

相关文章

Wireshark详解

Wireshark使用详解 1.Wireshark 简介2.下载与安装1. 下载地址2. 安装步骤&#xff08;以 Windows 为例&#xff09; 3. 界面与核心功能1. 主界面布局2. 常用菜单功能 4. 过滤功能详解1. 过滤类型2. 常用过滤命令 5. 过滤命令与网络结构对应6. 使用注意事项7. 案例分析 TCP 三次…

java 单例模式(Lazy Initialization)实现遍历文件夹下所有excel文件且返回其运行时间

单例模式Singleton介绍 定义 在java核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中&#xff0c;应用该模式的类一个类只有一个实例。即一个类只有一个对象实例 实现思路 将该类的构造方法定义为私有方法&#xff0c;这样其他处的代码就无法通过调用该…

buuctf-简单注册器题解

下载好资源包解压&#xff0c;发现是apk文件。 这里用apk改之理这个软件打开这个文件。 从这里用idea打开class文件&#xff0c;查看main函数 发现了这些代码&#xff0c;看到了注册码错误&#xff0c;那么上面的判断就是正确的flag 那么只要将题目给出的var5里的数值通过下面…

通过阿里云RDS排查解决MYSQL慢SQL--图文教学

通过自治服务和DMS解决数据库IOPS过高的问题&#xff0c;包括排查慢SQL、确定优化方向和使用无锁变更等步骤。 数据库IOPS居高不下&#xff0c;影响过多API业务信息 1. 跟进告警内容 【自治服务】-》【一键诊断】-》【当前资源使用率】-》【IOPS】 RDS-一键诊断 2. 排查慢…

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

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

使用快捷键高效管理 VSCode:提升工作效率,告别鼠标操作

如果你想提高工作效率&#xff0c;减少鼠标操作&#xff0c;掌握键盘快捷键是一个非常有效的方式。在编程过程中&#xff0c;熟练使用快捷键能够快速管理文件、标签页&#xff0c;节省时间并提升效率。比如&#xff0c;Ctrl P 和 Ctrl W 可以快速打开和关闭文件&#xff0c;而…

centos9之ESXi环境下安装

一、centos9简介 CentOS Stream 9是一个基于RHEL&#xff08;Red Hat Enterprise Linux&#xff09;的开源操作系统。它是CentOS Stream系列的最新版本。CentOS Stream是一个中间发行版&#xff0c;位于RHEL和Fedora之间&#xff0c;旨在提供更及时的软件更新和新功能。CentOS …

刚充值Deepseek账号,但接入官方的API却遇到了问题【VSCode Cline Cursor Deepseek deepseek-reasoner】

本文解决以下疑难杂症: 使用deepseek的最新接模型接入ide 使用deepseek的最新接模型接入vscode 使用deepseek的最新接模型接入vscode中的Cline 使用deepseek的最新接模型接入Cline 使用cursor接入Deepseek官方的的deepseek-reasoner模型api&#xff0c;而不是使用cursor p…