用脚步丈量人生宽度

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

其中,最常用的是 compile、provided、runtime、test,而 system 应避免使用,import 主要用于依赖管理。

评论

暂未收到

写下评论

支持 Markdown 语法