gpt4 book ai didi

maven - 当依赖树中存在两个或多个版本的依赖项时,Maven 如何选择该依赖项的版本?

转载 作者:行者123 更新时间:2023-12-04 12:43:42 24 4
gpt4 key购买 nike

我有一个项目依赖于我维护的名为 microservices-common 的库。 microservices-common 库依次依赖于commons-codec:1.11 .但是,当我尝试在我的项目中使用 microservices-common 时,commons-codec:1.10最终出现在我的类路径上,我的代码无法编译,因为 microservices-common 试图使用 org.apache.commons.codec.digest.DigestUtils添加到 commons-codec:1.11 的构造函数,但不存在于 commons-codec:1.10 .

这是 microservices-common 依赖树的相关部分:

[INFO] com.myproject:microservice-common:jar:1.0-SNAPSHOT
[INFO] +- commons-codec:commons-codec:jar:1.11:compile
[INFO] +- org.apache.httpcomponents:httpclient:jar:4.5.5:compile
[INFO] | \- (commons-codec:commons-codec:jar:1.10:compile - omitted for conflict with 1.11)
[INFO] \- com.myproject:restful:jar:4.1.5-SNAPSHOT:compile
[INFO] +- com.myproject:restful-common:jar:4.1.5-SNAPSHOT:compile
[INFO] | \- (commons-codec:commons-codec:jar:1.8:compile - omitted for conflict with 1.11)
[INFO] \- (commons-codec:commons-codec:jar:1.8:compile - omitted for conflict with 1.11)

如果我正确阅读了这棵树,其他版本的 commons-codec从类路径中省略了包括 v1.8 和 v1.10 在内的依赖项,以支持 v1.11,这正是我想要的。

但是,如果我从依赖 microservices-common 的项目的角度拉取依赖树,它看起来像这样:
[INFO] com.myproject:microservice:jar:1.0-SNAPSHOT
[INFO] +- org.apache.httpcomponents:httpasyncclient:jar:4.1.3:compile
[INFO] | \- org.apache.httpcomponents:httpclient:jar:4.5.3:compile
[INFO] | \- (commons-codec:commons-codec:jar:1.10:compile - version managed from 1.11; omitted for duplicate)
[INFO] \- com.myproject:microservice-common:jar:1.0-SNAPSHOT:compile
[INFO] +- commons-codec:commons-codec:jar:1.10:compile
[INFO] \- com.myproject:restful:jar:4.1.5-SNAPSHOT:compile
[INFO] +- com.myproject:restful-common:jar:4.1.5-SNAPSHOT:compile
[INFO] | \- (commons-codec:commons-codec:jar:1.10:compile - version managed from 1.8; omitted for duplicate)
[INFO] \- (commons-codec:commons-codec:jar:1.10:compile - version managed from 1.8; omitted for duplicate)

在这棵树中,我看到消息“从 1.x 管理的版本;因重复而省略”。我不确定这到底是什么意思,更令人担忧的是,第 6 行显示 commons-codec:1.10是最终出现在我的类路径上的东西,而不是我真正想要的 v1.11。

需要注意的是 pom.xmlcom.myproject:microservice-common:jar:1.0-SNAPSHOT声明 commons-codec:1.11依赖,所以唯一的地方就是 commons-codec:1.10可能来自 org.apache.httpcomponents:httpclient:jar:4.1.3com.myproject:restful:jar:4.1.5-SNAPSHOT (另一个由于遗留原因我无法摆脱的公共(public)库),但我不清楚为什么选择该版本的传递依赖项以包含在我的微服务公共(public)库声明的版本之上。

任何人都可以解释当依赖树中存在同一个库的多个版本时依赖选择是如何工作的,以及为什么 microservices-common 在隔离构建时似乎选择了传递依赖的正确版本,但我的微服务项目选择了不同的版本时我 build 它?

最佳答案

Maven 选择依赖树中最接近的依赖版本。这在 Maven documentation 中有很好的解释。 :

"nearest definition" means that the version used will be the closest one to your project in the tree of dependencies, eg. if dependencies for A, B, and C are defined as A -> B -> C -> D 2.0 and A -> E -> D 1.0, then D 1.0 will be used when building A because the path from A to D through E is shorter.



如果依赖在同一级别多次出现,则第一个声明获胜(自 Maven 2.0.9 起)。

确保使用所需版本的 commons-codec 的最佳和既定方法是声明 dependencyManagement在您的“微服务”pom 中(直接在 project 元素下):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
</dependencies>
</dependencyManagement>

此外,请确保您运行最新版本的 Maven(推荐 3.5)。

关于maven - 当依赖树中存在两个或多个版本的依赖项时,Maven 如何选择该依赖项的版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50262265/

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