maven - Artifact 范围不可传递是什么意思?

标签 maven scope

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

  • 这是否意味着如果我们在某些 pom 中包含一个具有范围作为测试的 Artifact ,那么它的依赖 Artifact 将不会自动下载/包含在类路径中?
  • 或者这是否意味着如果我们在某个 pom 中包含一个 Artifact ,那么它的范围为测试的依赖 Artifact 将不会被下载/包含在类路径中?
  • 或者是其他东西。

  • 据我所知,第一个是不正确的,第二个是正确的。有人可以告诉我它到底是什么意思吗?

    最佳答案

    要清楚,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 才能使用它。这些测试范围的依赖项将始终被忽略,无论您拥有声明的依赖项的范围(无论是 compileruntime 还是 test ),这就是 test 的原因范围被称为不可传递。

    换句话说,这完全取决于“some pom”的含义。当您在 POM 中声明测试范围的依赖项时,它将在测试类路径中可用。它的所有编译和运行时传递依赖项也将在测试类路径上可用,因为 compileruntime作用域是可传递的,将被继承,作用域为 test .当 POM 不是您自己的时,测试范围的依赖项将始终被省略(因此它的依赖项也将被省略)。

    关于maven - Artifact 范围不可传递是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41202120/

    相关文章:

    python - 如何访问类范围内的 "self"?

    c# - 将一个对象分配给同一类的另一个对象

    scala - 如何使用maven从specs + scalacheck获得漂亮的输出?

    maven - 尽管版本已管理,但为什么由于缺少dependency.version 而导致pom 无效?

    java - 如何使用 maven 部署 node.js 应用程序?

    java - maven项目中如何定义常用配置

    java - Sonarqube 安全报告 : OWASP Top 10

    php - 引用:什么是变量作用域?哪些变量可从何处访问?什么是“ undefined variable ”错误?

    java - Spring Batch StepScope Bean

    html - XML、S-Expressions 和重叠作用域……它叫什么?