gpt4 book ai didi

Maven 依赖解析和范围覆盖

转载 作者:行者123 更新时间:2023-12-03 08:49:41 25 4
gpt4 key购买 nike

免责声明

(我最初以非常详细的方式提出了这个问题 over here 。我在这里摘录了它,因为 maven-users 邮件列表在这个问题上已经安静了。)(不仅仅是另一个新手问题)

引用

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



该文档中有一个部分以“A second, and very important...”开头。在接下来的内容中,我将引用该部分的项目 AB ,并将从它们中摘录。

在该部分中,您将看到该项目 A有一个 <dependencyManagement>部分——除其他外——定义了一个 Artifact ,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项目 B (a) 继承自项目 A (因此继承了它的 dependencyManagement 部分)和 (b) 建立了对 Artifact c 的依赖。 ,而不必指定其 version .您还会注意到对 Artifact 的依赖 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神器 cruntime范围,而不是 compile范围。

那是对的吗? My maven-ear-plugin bug取决于这是预期行为的事实。这不是当 maven-ear-plugin 发生时会发生什么建立一个 .ear文件。

接下来,如果这是正确的,我也希望 if artifact c有任何传递 runtime依赖项它们将在 B 中可用的 runtime类路径(由 http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope 中有点莫名其妙的表定义)。

那是对的吗?

最佳答案

运行 mvn dependency:treebug link 中发布的示例项目上上面指定,

[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-leafmear-143-middle ,其中明确定义的依赖确实是 runtime ,覆盖 test dependencyManagement 中定义的范围父 pom 部分, mear-143 .

mear-143-ear , mear-143-leaf被传递地包括在内。这里 test dependencyManagement 中定义的范围的 mear-143优先于继承的 runtime范围。

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

b is defined in B's parent's dependency management section and since dependency management takes precedence over dependency mediation for transitive dependencies, version 1.0 will be selected should it be referenced in a or c's pom. b will also have compile scope

关于Maven 依赖解析和范围覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7588492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com