(我最初以非常详细的方式问了这个问题over here。我在这里摘录了它,因为maven-users
邮件列表在这个问题上变得安静了。)(不仅仅是另一个新手问题)
我的参考资料是 http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management;如果这已经过时或错误,请在本次讨论中告诉我。
该文件中有一节以“第二个,非常重要......”开头。在下文中,我将引用该部分的项目A
和B
,并将摘录它们。
在该部分中,您会看到项目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)中有些莫名其妙的表格定义。
这是对的吗?
答案 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
scope
中mear-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也有编译范围