maven依赖中scope详解

1,253 阅读3分钟

scope用于限制依赖的传递性并确定何时将依赖包含在类路径中。 共有6中scope设置:

  1. compile 默认的scope,未指定时使用。编译依赖项在项目的所有类路径中都可用,此外,这些依赖关系会传播到依赖项目。

  2. provided 这个和compile很像,但表示希望JDK或容器在运行时提供依赖关系。例如,在为Java Enterprise Edition构建web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为web容器提供了这些类。具有此范围的依赖项将添加到用于编译和测试的类路径中,但不会添加到运行时类路径中。它不是及物的。

  • 不具有传递性
  1. runtime 此范围表示编译时不需要依赖项,但执行时需要依赖项。Maven在运行时和测试类路径中包含具有此范围的依赖项,但在编译类路径中不包含。

  2. test 此范围表示应用程序的正常使用不需要依赖项,仅在测试编译和执行阶段可用。此范围不可传递。通常,此范围用于测试库,如JUnit和Mockito。如果在单元测试(src/test/java)中使用非测试库,而不是在模型代码(src/main/java)中使用,那么它也用于非测试库,如apachecommons IO。

  3. system 这个范围与provided的类似,只是您必须提供显式包含它的JAR。工件始终可用,并且不会在存储库中查找。

  • 被依赖项不会从maven仓库下载,而是从本地系统指定路径下寻找,需要 systemPath 属性
  1. import 只有部分中pom类型的依赖项才支持此范围。它表示将用指定POM的部分中的有效依赖项列表替换依赖项。由于它们被替换,具有导入范围的依赖项实际上并不参与限制依赖项的传递性。

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

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

NOTE: 这应该是运行时范围,因此必须显式列出所有编译依赖项。但是,如果您所依赖的库从另一个库扩展了一个类,则这两个库都必须在编译时可用。因此,编译时依赖项即使是可传递的,也仍然作为编译范围。

scope取值有效范围(compile, runtime, test)依赖传递例子
compileallspring-core
providedcompile, testservlet-api
runtimeruntime, testJDBC驱动
testtestJUnit
systemcompile, test-
备注:上述表格来源于 www.cnblogs.com/satire/p/15…