Maven Dependency Scope 详解:compile、provided、runtime、test、system、import 对比
2026-07-28
Maven
Dependency
Scope
一、 Scope 核心对比
| Scope 值 |
编译 |
测试 |
运行 |
打包 |
传递性 |
典型用途 |
| compile(默认) |
✓ |
✓ |
✓ |
✓ |
✓ |
核心业务依赖(如 Spring、Hutool) |
| provided |
✓ |
✓ |
✗ |
✗ |
✗ |
运行环境已提供(如 Servlet API) |
| runtime |
✗ |
✓ |
✓ |
✓ |
✓ |
仅运行期需要的实现(如 JDBC 驱动) |
| test |
✗ |
✓ |
✗ |
✗ |
✗ |
仅用于单元测试(如 JUnit、Mockito) |
| system(弃用) |
✓ |
✓ |
✗ |
✗ |
✗ |
强行指定本地 JAR 路径,破坏可移植性 |
| import |
✗ |
✗ |
✗ |
✗ |
✗ |
仅用于 <dependencyManagement> 导入 BOM |
二、 核心语义与场景速查
-
compile(默认)
- 特点:全阶段有效,打入最终包,向下传递。
- 场景:主代码中明确
import 的第三方库。
-
provided
- 特点:编译需要,运行不要(由容器/JDK提供),不打入最终包。
- 场景:Servlet API;部署到外部 Tomcat 时的内嵌容器。
-
runtime
- 特点:编译不需要,运行和测试需要。
- 场景:JDBC 驱动(代码只依赖
java.sql 标准接口,运行期才装载驱动)。
-
test
- 特点:仅测试阶段有效,主代码(
src/main)不可用,不打入最终包。
- 场景:测试框架及 Mock 工具。
-
system
- 特点:需搭配
<systemPath> 指向本地路径,官方已弃用。
- 替代:用
mvn install:install-file 安装到本地仓库。
-
import
- 特点:仅在
<dependencyManagement> 中生效,且必须搭配 <type>pom</type>。
- 场景:导入 BOM(如 Spring Boot Dependencies)统一管理版本,不实际引入 JAR 包。
三、 关键细节梳理
<dependencyManagement> 中的 scope:仅定义版本与 scope 的预设继承规则,不产生实际依赖。由于 compile 是默认值,无须显式写出 <scope>compile</scope>。
- 优化 scope 的收益:避免依赖冲突、减小最终打包体积、规范架构边界。