神器范围不具有传递性意味着什么?

时间:2016-12-17 19:09:20

标签: maven scope

在依赖范围" test"下的本文档(https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html)中,它表示测试范围不具有传递性。这是什么意思?

  1. 是否意味着如果我们在某些pom中包含一个带有作为测试范围的工件,那么它的相关工件将不会自动下载/包含在类路径中?
  2. 或者是否意味着如果我们在某个pom中包含一个工件,那么其作为测试范围的依赖工件将不会被下载/包含在类路径中?
  3. 或其他。
  4. 据我所知,第一个不正确,第二个是正确的。有人可以告诉我它到底是什么意思吗?

1 个答案:

答案 0 :(得分:5)

要清楚,this is the passage of the documentation

  

<强>测试
  此范围表示正常使用应用程序不需要依赖关系,并且仅可用于测试编译和执行阶段。这个范围不具有传递性。

这两个句子处理在依赖解析期间可能出现的情况:在POM中声明依赖关系,并考虑在POM中声明的依赖关系的传递依赖性。

第一部分意味着在POM中使用范围test的依赖项将导致该依赖项仅在测试类路径中可用。换句话说,当您在POM中明确声明了依赖项时,它适用:

<dependency>
  <!-- GAV coordinates -->
  <scope>test</scope>
</dependency>

尝试在主Java类(src/main/java下)中使用它将导致编译错误,并且在测试Java类(在src/test/java下)中使用它将正常工作。

第二部分适用于在POM中声明的依赖项的依赖项。这意味着将省略在POM中声明的依赖项的测试范围依赖项。例如,假设您对名为A的库具有编译时依赖性,并且A本身对B具有测试范围依赖性;然后B将在依赖项解析中被忽略,并且不会在您的类路径上结束。逻辑是,A需要B来运行其测试,但作为A的消费者,您不需要B能够使用它。这些测试范围的依赖项将始终被省略,无论您声明的依赖项的范围是什么(无论是compileruntime,还是test),这就是{{{ 1}}范围被称为不可传递。

换句话说,这完全取决于&#34;某些pom&#34;的含义。当您在POM中声明测试范围依赖项时,它将在测试类路径中可用。它的所有编译和运行时传递依赖性也将在测试类路径中可用,因为testcompile范围是可传递的,并且将以runtime的范围继承。当POM不是您自己的时,将始终省略测试范围依赖项(因此也将省略其依赖项)。