Maven中dependency的scope有哪些?

在 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 导入)

其中,最常用的是 compileprovidedruntimetest,而 system 应避免使用,import 主要用于依赖管理。

评论

等风等雨等你来