MAVEN Dependency Scope

mac2024-05-11  48

依赖范围 依赖范围依赖关系范围用于限制依赖关系的可传递性,并且还影响用于各种构建任务的类路径。 共有6个范围:

compile 这是默认范围,如果未指定范围,则使用此范围。编译依赖项在项目的所有类路径中均可用。此外,这些依赖项会传播到相关项目。

provided 类似于compile,但是表明您希望JDK或容器在运行时提供依赖项。例如,在为Java Enterprise Edition构建Web应用程序时,您将对Servlet API和相关Java EE API的依赖关系设置为范围,provided因为Web容器提供了这些类。该作用域仅在编译和测试类路径上可用,并且不可传递。

runtime 此范围表明依赖关系不是编译所必需的,而是执行所必需的。它在运行时和测试类路径中,但不在编译类路径中。

test 此范围表明依赖关系对于正常使用应用程序不是必需的,并且仅在测试编译和执行阶段可用。此范围不是可传递的。

system 此范围类似于,provided除了必须提供显式包含它的JAR之外。该工件始终可用,并且不会在存储库中查找。

import 仅pom在本节中的类型依赖项上支持此作用域。它指示要在指定的POM 部分中用有效的依赖关系列表替换的依赖关系。由于已替换它们,因此范围为的依赖项import实际上不会参与限制依赖项的可传递性。

每个作用域(除外import)都会以不同方式影响传递依赖关系,如下表所示。如果将依赖项设置为左列中的范围,则该依赖项的可传递依赖项与顶部行中的范围将导致在主项目中具有相交处列出的范围的依赖项。如果未列出作用域,则表示将忽略依赖项。

                                                                                                                      scope编译期测试期运行期说明*compileVVV默认scopetest V 只在测试期依赖,如junit包providedVV 运行期由容器提供,如servlet-api包runtime VV编译期间不需要直接引用systemVV 编译和测试时由本机环境提供 (*)注意:预期这应该是运行时范围,因此必须明确列出所有编译依赖项。但是,如果您依赖的库从另一个库扩展了一个类,则两者都必须在编译时可用。因此,即使编译时间相关性是可传递的,它们仍保留为编译范围。

参考:http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

最新回复(0)