返回列表

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

二、 核心语义与场景速查

  1. compile(默认)

    • 特点:全阶段有效,打入最终包,向下传递。
    • 场景:主代码中明确 import 的第三方库。
  2. provided

    • 特点:编译需要,运行不要(由容器/JDK提供),不打入最终包。
    • 场景:Servlet API;部署到外部 Tomcat 时的内嵌容器。
  3. runtime

    • 特点:编译不需要,运行和测试需要。
    • 场景:JDBC 驱动(代码只依赖 java.sql 标准接口,运行期才装载驱动)。
  4. test

    • 特点:仅测试阶段有效,主代码(src/main)不可用,不打入最终包。
    • 场景:测试框架及 Mock 工具。
  5. system

    • 特点:需搭配 <systemPath> 指向本地路径,官方已弃用
    • 替代:用 mvn install:install-file 安装到本地仓库。
  6. import

    • 特点:仅在 <dependencyManagement> 中生效,且必须搭配 <type>pom</type>
    • 场景:导入 BOM(如 Spring Boot Dependencies)统一管理版本,不实际引入 JAR 包

三、 关键细节梳理

  • <dependencyManagement> 中的 scope:仅定义版本与 scope 的预设继承规则,不产生实际依赖。由于 compile 是默认值,无须显式写出 <scope>compile</scope>
  • 优化 scope 的收益:避免依赖冲突、减小最终打包体积、规范架构边界。