Appearance
依赖范围
依赖范围(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
除外)对传递性依赖的影响不同,如下表所示。如果一个依赖的范围是左侧列的某个值,而该依赖的传递性依赖的范围是表格顶部的某个值,则该依赖在主项目中的范围将在交叉单元格中列出。如果单元格为空,则表示该依赖不会被包含。
compile | provided | runtime | test | |
---|---|---|---|---|
compile | compile(*) | - | runtime | - |
provided | provided | - | provided | - |
runtime | runtime | - | runtime | - |
test | test | - | test | - |
NOTE
本意是应将其设置为 runtime
作用域,以便所有 compile
依赖都必须显式列出。然而,如果你依赖的库扩展了另一个库的类,那么这两个库都必须在编译时可用。因此,即使是传递性依赖,编译时依赖仍然保持 compile
作用域。