在 Maven 中,<dependency>
的 scope
用于控制依赖项在构建生命周期的不同阶段是否可用。共有 6 种标准 scope,每种适用于不同的场景:
1. compile
(默认值,未指定时使用)
- ✅ 编译(compile)、测试(test)、运行(runtime) 均可用
- ⚠️ 会包含在最终的打包(JAR/WAR)中
- 💡 适用场景:项目中绝大多数依赖(如 Spring Core、Lombok、Gson)
2. provided
- ✅ 编译(compile)、测试(test) 可用
- ❌ 运行时(runtime)由目标环境(如JDK/Tomcat)提供,不会打到包里
- 💡 适用场景:Servlet API、JDBC API(
javax.servlet:servlet-api
、Java EE APIs)
3. runtime
- ❌ 编译时(compile)不可用(无法
import
使用) - ✅ 测试(test)、运行(runtime) 可用
- 💡 适用场景:JDBC 驱动、反射加载的实现类(
mysql-connector-java
)
4. test
- ✅ 仅在测试(test)和测试编译阶段 可用
- ❌ 不会打包到发布版本(如生产环境 JAR 包)
- 💡 适用场景:JUnit、Mockito、TestNG
5. system
(已弃用)
- ✅ 类似于
provided
,但要显式指定 JAR 路径(systemPath
) - ⚠️ 不推荐使用(易移植性差)
- 💡 适用场景:本地库文件(极少使用)
6. import
(仅适用于 <dependencyManagement>
)
- ✅ 用于 导入 BOM(Bill of Materials) 定义的依赖版本
- ⚠️ 不实际引入依赖,只是版本管理
- 💡 适用场景:Spring Boot BOM(
spring-boot-dependencies
)
总结对比表
Scope | 编译(compile)可用? | 测试(test)可用? | 运行(runtime)可用? | 打包(package)是否包含? | 主要用途 |
---|---|---|---|---|---|
compile | ✅ | ✅ | ✅ | ✅ | 项目主要依赖(默认值) |
provided | ✅ | ✅ | ❌ | ❌ | 由运行时环境提供(如 Tomcat 的 Servlet API) |
runtime | ❌ | ✅ | ✅ | ✅ | 仅运行时需要(如 JDBC 驱动) |
test | ❌ | ✅ | ❌ | ❌ | 测试专用(JUnit、Mockito) |
system | ✅ | ✅ | ❌ | 🟡(取决于配置) | 本地 JAR(已废弃) |
import | - | - | - | - | 仅管理依赖版本(BOM 导入) |
其中,最常用的是 compile
、provided
、runtime
、test
,而 system
应避免使用,import
主要用于依赖管理。
评论