2016-12-17 32 views
2

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

  1. 这是否意味着如果我们在某些pom中包含一个作用域作为测试的工件,那么它的相关工件将不会自动下载/包含在classpath中?
  2. 或者这是否意味着如果我们在某些pom中包含工件,那么其作为测试范围的相关工件将不会被下载/包含在classpath中?
  3. 或其他东西。

据我所知,第一个是不正确的,第二个是正确的。有人可以告诉我究竟是什么意思?

回答

3

需要明确的是,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就能够使用它。无论您声明的依赖项的范围如何(无论是compile,runtime还是test),这些测试范围的依赖关系都将被忽略,这就是为什么test范围被称为不可传递的原因。

换句话说,这一切都取决于“有些朋友”的含义。当您在POM中声明测试作用域依赖项时,它将在测试类路径中可用。它的所有编译和运行时传递依赖关系也将在测试类路径中可用,因为compileruntime范围是可传递的,并且将继承范围为test。当POM不是你自己的时候,测试作用域依赖将会被忽略(因此它的依赖关系也将被忽略)。

+0

我没有得到“pom不是你自己”的一行时,请你详细说明一下吗? –

+0

@ user2509521“当pom不是你自己的时候”意味着我在谈论其他依赖关系的POM,即传递依赖关系。如果我的依赖关系的依赖关系是范围测试,那么它们在解析期间被省略。 – Tunaki