在本文档( https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html )中,依赖范围“test”下,它说测试范围不是可传递的。这是什么意思?
据我所知,第一个是不正确的,第二个是正确的。有人可以告诉我它到底是什么意思吗?
最佳答案
要清楚,this is the passage of the documentation :
test
This scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases. This scope is not transitive.
这两句话处理依赖解析过程中可能出现的情况:在 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
的原因范围被称为不可传递。换句话说,这完全取决于“some pom”的含义。当您在 POM 中声明测试范围的依赖项时,它将在测试类路径中可用。它的所有编译和运行时传递依赖项也将在测试类路径上可用,因为
compile
和 runtime
作用域是可传递的,将被继承,作用域为 test
.当 POM 不是您自己的时,测试范围的依赖项将始终被省略(因此它的依赖项也将被省略)。
关于maven - Artifact 范围不可传递是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41202120/