Maven 依赖坐标的 Scope各枚举值 取值含义、示例、完整解析!
Maven 依赖 Scope 完整解析
Maven 的完整生命周期包括:validate、compile、test、package、verify、install 和 deploy。
Maven 的 <scope> 决定了依赖在项目构建生命周期中的可见性和作用范围。以下是所有 <scope> 取值的详细说明、示例及解释。
Scope 类型及含义
| Scope 值 | 含义与功能 | 生命周期中的作用 |
|---|---|---|
| compile | 默认值。表示依赖在编译、测试、运行阶段都可用。 |
编译时、测试时、运行时均可用,最终会被打包到产物(jar/war)中。 |
| provided | 表示依赖由 JDK 或容器提供,不随项目打包。 | 编译时可用,测试时可用,但运行时不会被包含在最终包中(例如 Servlet API)。 |
| runtime | 表示依赖仅在运行和测试时可用,不用于编译。 |
编译阶段不可用,运行时和测试阶段可用,最终会被打包。 |
| test | 表示依赖只在测试代码中使用。 |
仅在测试阶段(如 mvn test)可用,编译和运行阶段不可用,不打包到产物中。 |
| system | 与 provided 类似,但依赖必须显式指定本地路径。 | 编译和测试阶段可用,不会自动下载依赖,需要手动指定 <systemPath>,不推荐使用。 |
| import | 仅用于 dependencyManagement 中,引入其他 POM 的依赖管理。 | 不直接作为依赖使用,而是导入一个 BOM(Bill of Materials)进行版本管理。 |
各 Scope 示例及解释
1. compile
示例:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
<scope>compile</scope>
</dependency>
解释: compile 是默认 scope,表示依赖(如 Apache Commons Lang)在编译、测试和运行时都可用。最终会被打包到项目的 jar/war 文件中,适用于项目核心功能所需的库。
2. provided
示例:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
解释: provided 表示依赖由 JDK 或运行时容器(如 Tomcat)提供,仅在编译和测试阶段需要。例如,Servlet API 在开发 Web 应用时用于编译,但运行时由容器提供,因此不会打包到最终产物中。
3. runtime
示例:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
<scope>runtime</scope>
</dependency>
解释: runtime 表示依赖仅在运行和测试时需要,不参与编译。例如,MySQL 驱动在运行时连接数据库时使用,但编译时不需要,因此会被打包到最终产物中。
4. test
示例:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
解释: test 表示依赖仅用于测试阶段(如运行 mvn test)。JUnit 依赖用于单元测试,编译和运行主代码时不可用,也不会打包到最终产物中。
5. system
示例:
<dependency>
<groupId>com.example</groupId>
<artifactId>custom-lib</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/custom-lib.jar</systemPath>
</dependency>
解释: system 表示依赖是本地文件,需通过 <systemPath> 指定路径。仅在编译和测试时可用,不会从 Maven 仓库下载。由于维护复杂,不推荐使用。
6. import
示例:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
解释: import 仅用于 <dependencyManagement> 部分,用于导入其他 POM 文件(如 Spring Boot 的 BOM)中的依赖版本管理。它不直接引入依赖,而是统一管理版本号,方便项目中依赖版本一致性。

浙公网安备 33010602011771号