java - Maven依赖管理中的“群压”
问题描述
我在使用 Maven 时遇到问题,在我的项目A 的com.google.guava
多层传递依赖项中,该库被引用了大约六次。几乎所有这些依赖项都需要旧版本。18.0
我已经编写了另一个在项目A中使用的依赖项B。这种依赖直接依赖于 的版本,但 Maven 仍然会选择更新的版本。28.0
com.google.guava
18.0
除非我根据B在所有项目中明确包含较新版本,否则由于NoMethodError
s 等,该库将无法正常工作。如果我这样做,我可能会因为依赖项的新二进制不兼容版本而遇到所有其他库的问题。
实际上,我正承受着使用旧版本依赖项的群体压力,因为其他人都在这样做。
为什么 Maven 不选择最新版本呢?我能做些什么来说服 Maven 在所有项目中根据B使用较新的版本?
有没有办法在我的依赖项使用时分离关注点并让所有其他依赖项实际使用?18.0
28.0
如果只是稍微大一点的包大小是为跨项目支付更多现代库的奖励......
也许有可能为我的库B硬链接某个依赖版本,所以只有我的库使用较新的版本?
解决方案
在 Maven 中,您可以使用<dependencyManagement>
使用此标签,您可以明确告诉 maven 您希望项目使用哪些版本的依赖项。
对于番石榴,您可以执行以下操作:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0</version>
</dependency>
...
</dependencies>
</dependencyManagement>
然后你可以做一些事情,比如:
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
...
</dependencies>
这将迫使 maven 使用 guava 18 依赖项
推荐阅读
- go - GORM如何获取相关数据?
- amazon-web-services - 在 yaml 中的变量名中使用破折号
- ssms - SSMS 导入向导无法加载带有日期和时间的 CSV 日期列(以毫秒为单位)
- java - java swing - 如何在下一个使用的顶部绘制一个矩形?
- python-3.x - 如何使用 tkinter 按钮执行 python 文件?
- video-streaming - 如何在 webrtc 中提高质量并降低帧速率?
- c++ - 在 Windows 上挂起 printf
- python-3.x - 如何使用 python 3.8 获取 AWS S3 对象位置/URL?
- java - Eclipse找不到maven项目的主类
- mysql - SQL 查询执行很慢:需要优化