Skip to content

依赖范围

依赖范围(Dependency Scope) 用于限制依赖的传递性,并决定依赖在类路径中的包含时机。

共有 6 种依赖范围(Scope):

  • compile(编译):这是默认范围,如果未指定范围,则使用此范围。编译依赖在项目的所有类路径中可用,并且会传播到依赖该项目的其他项目。
  • provided(已提供):与 compile 类似,但表示该依赖将在运行时由 JDK 或容器提供。例如,在构建 Java EE Web 应用程序时,Servlet API 及相关 Java EE API 应设置为 provided,因为 Web 容器会提供这些类。此范围的依赖会添加到编译和测试的类路径中,但不会添加到运行时类路径中,并且不会传递给依赖该项目的其他项目。
  • runtime(运行时):表示该依赖在编译时不需要,但在运行时需要。Maven 会将此范围的依赖添加到运行时和测试的类路径中,但不会添加到编译时类路径中。
  • test(测试):表示该依赖仅用于测试,不用于应用程序的正常运行。它仅在测试编译和执行阶段可用,不会传递给依赖该项目的其他项目。通常用于测试库(如 JUnit 和 Mockito),也适用于非测试库(如 Apache Commons IO),如果这些库仅在单元测试代码(src/test/java)中使用,而不在主代码(src/main/java)中使用。
  • system(系统):表示该依赖在编译和运行时都需要,但 Maven 不会从远程仓库下载它,而是从本地文件系统的指定路径查找 JAR 文件。
  • import(导入):仅适用于 dependencyManagement 部分中类型为 pom 的依赖,表示该依赖会被替换为指定 POM 文件 dependencyManagement 部分的所有依赖列表。由于 import 依赖会被替换,因此它不会影响依赖的传递性。

每种依赖范围(import 除外)对传递性依赖的影响不同,如下表所示。如果一个依赖的范围是左侧列的某个值,而该依赖的传递性依赖的范围是表格顶部的某个值,则该依赖在主项目中的范围将在交叉单元格中列出。如果单元格为空,则表示该依赖不会被包含。

compileprovidedruntimetest
compilecompile(*)-runtime-
providedprovided-provided-
runtimeruntime-runtime-
testtest-test-

NOTE

本意是应将其设置为 runtime 作用域,以便所有 compile 依赖都必须显式列出。然而,如果你依赖的库扩展了另一个库的类,那么这两个库都必须在编译时可用。因此,即使是传递性依赖,编译时依赖仍然保持 compile 作用域。