Mus*_*ice 9 dependencies dependency-management maven
我有一个项目依赖于我维护的一个名为 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)
Run Code Online (Sandbox Code Playgroud)
如果我正确地读取了树,则其他版本的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)
Run Code Online (Sandbox Code Playgroud)
在此树中,我看到消息“版本从 1.x 管理;省略重复”。我不确定这到底意味着什么,更令人担忧的是,第 6 行显示的是commons-codec:1.10我的类路径中最终出现的内容,而不是我真正想要的 v1.11。
应该注意的是,pom.xmlforcom.myproject:microservice-common:jar:1.0-SNAPSHOT声明了commons-codec:1.11依赖关系,因此 the 唯一commons-codec:1.10 可能来自的地方是org.apache.httpcomponents:httpclient:jar:4.1.3或com.myproject:restful:jar:4.1.5-SNAPSHOT(由于遗留原因我无法摆脱的另一个公共库),但我不清楚为什么该版本传递依赖项的一部分被选择包含在我的微服务通用库声明的版本中。
任何人都可以解释当依赖树中存在同一库的多个版本时依赖项选择如何工作,以及为什么 microservices-common 在隔离构建时似乎选择了传递依赖项的正确版本,但当我时我的微服务项目选择了不同的版本建造它?
Maven 选择依赖关系树中最接近的依赖关系版本。Maven 文档对此进行了很好的解释:
“最近的定义”意味着使用的版本将是依赖树中最接近您的项目的版本,例如。如果 A、B 和 C 的依赖关系定义为 A -> B -> C -> D 2.0 和 A -> E -> D 1.0,则构建 A 时将使用 D 1.0,因为从 A 到 D 的路径通过E 较短。
如果依赖关系在同一级别多次出现,则第一个声明获胜(自 Maven 2.0.9 起)。
dependencyManagement确保使用所需版本的 commons-codec 的最佳且既定方法是在“微服务”pom 中声明(直接在project元素下):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
</dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)
另外,请确保您运行最新版本的 Maven(推荐 3.5)。
| 归档时间: |
|
| 查看次数: |
2748 次 |
| 最近记录: |