Maven依赖解析和范围覆盖

Lai*_*son 32 dependency-management maven maven-ear-plugin

放弃

(我最初在这里以非常详细的方式问过这个问题.我在这里摘录了它,因为maven-users邮件列表在这个问题上变得安静了.)(不仅仅是另一个新手问题)

参考

我的参考资料是 http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management ; 如果这已经过时或错误,请在本次讨论中告诉我.

该文件中有一节以"第二个,非常重要......"开头.接下来,我将把该部分的项目AB,并从他们身上摘录.

在该部分中,您将看到该项目A有一个<dependencyManagement>部分 - 除其他外 - 定义工件,c具有范围compile:

<!-- In A's pom.xml; condensed for brevity -->
<dependencyManagement>
    <dependency>
        <groupId>test</groupId>
        <artifactId>c</artifactId>
        <version>1.0</version>
        <scope>compile</scope> <!-- look: compile scope -->
    </dependency>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)

然后你会看到一个pom.xmlfor项目B,(a)继承自项目A(因此继承其dependencyManagement部分)和(b)建立对工件的依赖c,而不必指定它version.您还会注意到,在神器的依赖c覆盖的范围cruntime,不是compile:

<!-- In B's pom.xml, whose parent is A's pom.xml (above); condensed for brevity -->
<dependencies>
    <dependency>
        <groupId>test</groupId>
        <artifactId>c</artifactId>
        <scope>runtime</scope> <!-- look: runtime scope -->
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

同样,你会注意到没有<version>元素,但有一个<scope>runtime</scope>元素.

我对此的解释是,当一切都说过和做过,B将取决于版本1.0神器cruntime范围,而不是compile范围.

那是对的吗?我的maven-ear-plugin错误在于这是预期的行为.这不是maven-ear-plugin构建.ear文件时发生的事情.

接下来,如果这是正确的,我会还预计,如果神器c有任何传递runtime依赖他们将在现有Bruntime类路径(由有些莫名其妙表中定义http://maven.apache.org/guides/introduction/introduction- to-dependency-mechanism.html#Dependency_Scope).

那是对的吗?

Rag*_*ram 24

运行mvn dependency:tree在上面指定的bug链接中发布的示例项目,

[INFO] Building MEAR-143 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ mear-143 ---
[INFO] ljnelson:mear-143:pom:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:4.8.2:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MEAR-143 Leaf 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ mear-143-leaf ---
[INFO] ljnelson:mear-143-leaf:jar:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:4.8.2:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MEAR-143 Middle 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ mear-143-middle ---
[INFO] ljnelson:mear-143-middle:jar:1.0-SNAPSHOT
[INFO] +- ljnelson:mear-143-leaf:jar:1.0-SNAPSHOT:runtime
[INFO] \- junit:junit:jar:4.8.2:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MEAR-143 EAR 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ mear-143-ear ---
[INFO] ljnelson:mear-143-ear:ear:1.0-SNAPSHOT
[INFO] +- ljnelson:mear-143-middle:jar:1.0-SNAPSHOT:runtime
[INFO] |  \- ljnelson:mear-143-leaf:jar:1.0-SNAPSHOT:test (scope managed from ru
ntime)
[INFO] \- junit:junit:jar:4.8.2:test
Run Code Online (Sandbox Code Playgroud)

确实依赖于显式定义依赖scopemear-143-leafin mear-143-middle的依赖性runtime,覆盖了父pom部分中test定义的范围.dependencyManagementmear-143

mear-143-ear,mear-143-leaf包含传递.在这里,test在规定范围内dependencyManagementmear-143优先继承的runtime范围.

我想这与你上面提到的部分中第二个项目符号点中指定的内容一致.在此引用它并以粗体和斜体突出显示相关部分:

b在B的父亲的依赖关系管理部分中定义,并且因为 依赖关系管理优先于依赖关系调解传递依赖关系,所以如果在一个或多个pom中引用它,将选择版本1.0.b也有编译范围

  • 谢谢; 意识到它优先于*scope*(不仅仅是版本)是我失踪的关键. (6认同)
  • 有没有办法覆盖子 pom 中托管依赖项的范围? (2认同)