Appearance
Maven 依赖范围
依赖范围用于限制依赖的传递性并确定何时在类路径中包含依赖。
有六种范围:
compile(编译):这是默认范围,如果未指定则使用此范围。编译依赖在项目的所有类路径中都可用。此外,这些依赖会传递给依赖的项目。provided(已提供):这很像compile,但表示你期望 JDK 或容器在运行时提供该依赖。例如,在为 Java 企业版构建 Web 应用程序时,你会将对 Servlet API 和相关 Java EE API 的依赖设置为provided范围,因为 Web 容器会提供这些类。具有此范围的依赖会被添加到用于编译和测试的类路径中,但不会添加到运行时类路径中。它不是传递性的。runtime(运行时):此范围表示该依赖在编译时不需要,但在执行时需要。Maven 在运行时和测试类路径中包含具有此范围的依赖,但不在编译类路径中。test(测试):此范围表示该依赖在应用程序的正常使用中不需要,仅在测试的编译和执行阶段可用。此范围不是传递性的。通常,此范围用于测试库,如 JUnit 和 Mockito。如果非测试库(如 Apache Commons IO)在单元测试(src/test/java)中使用但不在模型代码(src/main/java)中使用,也会使用此范围。system(系统):此范围与provided类似,不同之处在于你必须显式提供包含它的 JAR。该工件始终可用,并且不会在存储库中查找。import:此范围仅在<dependencyManagement>部分中类型为pom的依赖项上受支持。它表示该依赖将被指定 POM 的<dependencyManagement>部分中的有效依赖列表替换。由于它们被替换,具有import范围的依赖实际上并不参与限制依赖的传递性。
除了 import 之外的每个范围都以不同的方式影响传递性依赖,如下表所示。如果一个依赖项的范围设置为左列中的某个范围(例如 compile),那么这个依赖项的传递依赖项(即它所依赖的其他库)在顶部行中的范围(例如 runtime)相交时,结果是在主项目中具有交叉点列出的范围的依赖项。如果未列出范围,则表示该依赖被省略。
compile | provided | runtime | test | |
|---|---|---|---|---|
compile | compile(*) | - | runtime | - |
provided | provided | - | provided | - |
runtime | runtime | - | runtime | - |
test | test | - | test | - |
举个例子:
如果你的项目依赖一个
compile范围的库 A,而库 A 又依赖一个runtime范围的库 B,那么在你的主项目中,库 B 的范围将是runtime。如果你的项目依赖一个
runtime范围的库 C,而库 C 又依赖一个provided范围的库 D,那么在你的主项目中,库 D 将被省略(因为表格中没有列出范围)。
Warning:
(*)这应该是runtime范围,以便所有编译依赖项必须明确列出。然而,如果您依赖的库扩展了另一个库的类,则两者都必须在编译时可用。因此,即使是传递依赖关系,编译时依赖关系仍然保持为编译范围。