34

免责声明

(我最初在这里以非常详细的方式提出了这个问题。我在这里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.xmlfor 项目B,它 (a) 从 project 继承A(因此继承了它的dependencyManagement部分)并且 (b) 建立了对 artifact 的依赖c,而不必指定它的version. 您还会注意到对 artifact 的依赖c覆盖了cto be的范围,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的工件版本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)。

那是对的吗?

4

1 回答 1

26

在上面指定的错误链接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

in的依赖scope,其中显式定义了依赖,确实覆盖了父 pom 部分中定义的范围。mear-143-leafmear-143-middleruntimetestdependencyManagementmear-143

mear-143-earmear-143-leaf及物包括在内。这里test定义的范围dependencyManagement优先mear-143于继承的runtime范围。

我想这与您在上面提到的部分的第二个要点中指定的内容一致。在这里引用它并以粗体和斜体突出显示相关部分:

b 在 B 的父级的依赖管理部分中定义,并且由于 依赖管理优先于传递依赖的依赖中介,因此如果在 a 或 c 的 pom 中引用它,将选择 1.0 版本。b 也将具有编译范围

于 2011-09-29T12:52:03.133 回答