依赖作用域用于限制依赖项的传递性,并影响用于各种构建任务的 classpath。
一共有6个:
- compile:
默认项,编译依赖项在项目的所有类路径中都可用。此外,这些依赖项将打包到依赖的项目。
- provided:
跟默认项类似,不同的是在运行时JDK会提供依赖,例如,当为Java Enterprise Edition构建web应用程序时,您将对Servlet API和相关Java EE API的依赖设置为 provided
,因为web容器提供了这些类。仅在编译和测试类路径上使用,且不打入包内。
- runtime:
此范围指示此依赖项不是编译所需的,而是执行所需的。它位于运行时和测试类路径中,但不在编译类路径中。
- test
此范围表示应用程序的正常使用不需要依赖项,仅在测试编译和执行阶段可用。这个范围将不会对依赖项进行打包。
- system
除了必须显式地提供包含它的JAR之外,此范围与 provided
的类似。被标识的依赖项是可用的,并且不会在仓库中查找。样例:
<project>
...
<dependencies>
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
</dependencies>
...
</project>
- import
仅支持 pom 类型的 <dependencyManagement> 节点中使用。
它指示要用指定POM的<dependencyManagement>节中的有效依赖项列表替换依赖项。由于替换了依赖项,具有 import
范围的依赖项实际上并不参与限制依赖项的传递性。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
每个范围(导入 import )都以不同的方式影响传递依赖关系,如下表所示。如果将依赖项设置为左列中的作用域,则该依赖项与第一行中的作用域的传递依赖项将导致主项目中的依赖项,其作用域列在交集处。如果没有列出范围,则意味着将省略依赖项。
| compile | provided | runtime | test |
compile | compile(*) | - | runtime | - |
provided | provided | - | provided | - |
runtime | runtime | - | runtime | - |
test | test | - | test | - |
注意:
我们希望这应该是运行时范围,以便所有编译依赖项都必须显式列出。但是,如果您所依赖的库从另一个库扩展了一个类,那么这两个库必须在编译时可用。因此,即使编译时依赖项是传递的,它们仍然作为编译范围。