Maven依赖解析和范围覆盖

时间:2011-09-28 19:27:11

标签: maven dependency-management maven-ear-plugin

声明

(我最初以非常详细的方式问了这个问题over here。我在这里摘录了它,因为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>

然后,您将看到项目pom.xml的{​​{1}},(a)继承自项目B(从而继承其A部分)和(b)建立依赖关系在工件dependencyManagement上,无需指定其c。您还会注意到对工件version的依赖性会将c的范围覆盖为c,而不是runtime

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> 元素,但有一个<version>元素。

我对此的解释是,当所有内容完成后, <scope>runtime</scope>将取决于B范围内工件1.0的版本c,而不是{ {1}}范围。

这是对的吗? My maven-ear-plugin bug取决于这是预期的行为。当runtime构建compile文件时,不会发生这种情况。

接下来,如果这是正确的,我还希望如果工件maven-ear-plugin具有任何传递.ear依赖关系,它们将在c的{​​{1}}类路径中可用(如由http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope)中有些莫名其妙的表格定义。

这是对的吗?

1 个答案:

答案 0 :(得分:24)

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

[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

scopemear-143-leaf的依赖mear-143-middle,其中明确定义了依赖关系,确实是runtime,覆盖了test中定义的dependencyManagement范围1}}父pom的部分,mear-143

mear-143-ear中,mear-143-leaf包含传递。此处test dependencyManagement中定义的mear-143范围优先于继承的runtime范围。

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

  

b在B的父亲的依赖关系管理部分中定义   依赖关系管理优先于依赖关系中介   传递依赖,版本1.0将被选中   在a或c的pom中引用。 b也有编译范围