版本依赖冲突问题排查过程记录

问题

开发平台在集成minio时,pom引入了sdk。

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.7</version>
</dependency>

在调用上传文件API时,控制台报错:
image.png
从错误来看,是okhttp的版本过低,minio要求版本4.11.0及以上.
初看这错误一脸懵,okhttp是minio内部依赖的jar包,难不成其他地方也在使用,造成了版本冲突?

排查

使用maven helper插件提供的jar包依赖分析,发现并没有出现okhttp冲突的情况,如下图:
image.png
然后整个项目工程中搜索okhttp关键字,任何模块没有显性使用过。
查看使用minio组件模块的依赖,确认当前使用的okhttp的版本是3.14.8,明显低于控制台中提示的版本4.11.0。
image.png
这就奇怪了,其他模块没有使用okhttp,为什么会出现了与minio要求不一致的版本呢?

尝试

调整使用minio组件的oss模块的pom文件,将minio的引用中排除okhttp,然后再单独添加对okhttp4.12.0版本的依赖。

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.7</version><exclusions><exclusion><artifactId>okhttp</artifactId><groupId>com.squareup.okhttp3</groupId></exclusion></exclusions>
</dependency>
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.12.0</version>
</dependency>

使用maven clean install,查看依赖的okhttp,仍然是旧版本,上述调整并没有生效。
注:网上不少文章都是这么做的,实际并不能解决问题。

对比

与原来做技术验证的miniodemo项目对比,查看依赖的okhttp包,其版本是正常的,如下图所示:
image.png
此对比确认minio组件自身没有问题,基本确定问题根源在于开发平台的环境上。

定位

问题排查到这一步,基本能定位根源了,就是开发平台使用了spring-boot-dependencies来管理组件内部的依赖关系。

  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${springboot.version}</version><type>pom</type><scope>import</scope></dependency>

这么做是因为众多的组件,常常会因为版本不兼容引发冲突和异常,spring-boot-dependencies会将经过严格的兼容性测试的组件版本进行统一维护和管理。附带的另一个好处是,引用组件时只需要指定groupId和artifactId,version属性可以省略。
在spring-boot-dependencies的pom文件中搜索okhttp,果然发现里面定义的版本3.14.8,与上面的有冲突的版本一致。
image.png

解决

问题根源找到了,解决自然也容易。在项目的根pom中,引入okhttp,指定版本,这么做会覆盖spring-boot-dependencies的版本设置,但同时也意味着需要你自行确保新版本的okhttp与其他组件不存在冲突。

  <!-- 依赖声明 --><dependencyManagement><dependencies><!--spring boot dependencies--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${springboot.version}</version><type>pom</type><scope>import</scope></dependency>……<!--强制指定版本,优先级高于spring-boot-dependencies--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.12.0</version></dependency></dependencies></dependencyManagement>

反思

实际该情况并不是第一次遇到,之前lombok组件也曾出现过类似的问题,其现象是编辑器报类似如下警告: java: You aren’t using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok supports: OpenJDK javac, ECJ。
按照上述方式设置了lombok的新版本后,问题解决。

同时,需要注意这里有个反常识的地方,即全局的依赖管理,优先级要高于具体模块的pom配置。

知识延伸

java中库特别多,版本也很多,组合使用是存在版本冲突问题。例如在使用Spring的时候,经常会使用到第三方库,一般大家都是根据经验挑选一个版本号或挑选最新的,随意性较大,其实这是有问题的,除非做过完整的测试,保证集成该版本的依赖不会出现问题,且后续集成其它第三方库的时候也不会出现问题,否则风险较大,且后续扩展会越来越困难,因为随着业务复杂度的增加,集成的第三方组件会越来会多,依赖之间的关联也会也来越复杂。

除了本文提到的用于springboot项目的spring-boot-dependencies外,还有两个常用的版本依赖管理组件。
io.spring.platform适用于spring大家族。
spring-cloud-dependencies适用于spring-cloud微服务框架。

 <dependency><groupId>io.spring.platform</groupId><artifactId>platform-bom</artifactId><version>Cairo-SR8</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2020.0.0</version><type>pom</type><scope>import</scope></dependency>

需要注意的是,以上两个依赖管理库,只负责自己发布的库及相关库,并不能覆盖所有库,因此,部分库还得写版本号。

同理,使用了这两个组件来管理依赖,也会发生本文类似问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/209323.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何开启Windows Server 2016 远端桌面

使用GUI 设定 服务器管理器–> 本地服务器–> 远端桌面 启用远端桌面 远端–> 允许远端连线至此电脑 会提示防火墙设定跟电源设定 防火墙之前已经关闭了 完成

fpga rom 初始化文件的一些心得

目录 可能遇到的问题 问题 解决方案 rom的初始化 用途 文件类型 如何生成初始化文件 示例 Altera Xilinx 可能遇到的问题 问题 altera FPGA的rom找不到初始化文件&#xff0c;编译过程会提示类似的问题 Error(127001): Cant find Memory Initialization File or He…

Google Earth Engine谷歌地球引擎计算多年中某两个时间点之间遥感数据差值的平均值

本文介绍在谷歌地球引擎GEE中&#xff0c;提取、计算某一种遥感影像产品在连续的多年中&#xff0c;2个不同时相的数据差值的多年平均值&#xff0c;并将计算得到的这一景差值的结果图像导出的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#x…

R语言单因素方差分析+差异显著字母法标注+逐行详细解释

R语言单因素方差分析 代码如下 df <- read.csv("data.csv",header TRUE,row.names 1) library(reshape2) df <- melt(df,idc()) names(df) <- c(trt, val) df aov1 <- aov(val~trt,datadf) summary(aov1)library(agricolae) data <- LSD.test(aov…

harmonyOS学习笔记之stateStyles

stateStyles:多态样式 stateStyles可以依据组件的内部状态的不同,设置不同的样式 stateStyles是属性方法,可以根据状态来设置样式,类似于css伪类,但是语法不一样,ArkUI提供了四种状态: focused:获焦态 normal:正常态 pressed:按压态 disable:不可用态例如: Entry Component …

NAND Flash和NOR Flash的异同

NAND Flash和NOR Flash是两种常见的闪存类型。 NOR Flash是Intel于1988年首先开发出来的存储技术&#xff0c;改变了原先由EPROM和EEPROM一统天下的局面。 NAND Flash是东芝公司于1989年发布的存储结构&#xff0c;强调降低每比特的成本&#xff0c;更高的性能&#xff0c;并…

java企业财务管理系统springboot+jsp

1、基本内容 &#xff08;1&#xff09;搭建基础环境&#xff0c;下载JDK、开发工具eclipse/idea。 &#xff08;2&#xff09;通过HTML/CSS/JS搭建前端框架。 &#xff08;3&#xff09;下载MySql数据库&#xff0c;设计数据库表&#xff0c;用于存储系统数据。 &#xff08;4…

LeedCode刷题---子数组问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、最大子数组和 题目链接&#xff1a;最大子数组和 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连…

【计算机组成原理】存储器知识

目录 1、存储器分类 1.1、按存储介质分类 1.2、按存取方式分类 1.3、按信息的可改写性分类 1.4、按信息的可保存性分类 1.5、按功能和存取速度分类 2、存储器技术指标 2.1、存储容量 2.2、存取速度 3、存储系统层次结构 4、主存的基本结构 5、主存中数据的存放 5.…

浅学指针(5)sizeof和strlen的进阶理解

系列文章目录 文章目录 系列文章目录前言1. sizeof和strlen的对⽐1.1 sizeofsizeof不是函数&#xff0c;是运算符 1.2 strlen1.3 sizeof 和 strlen的对⽐ 2. 数组和指针笔试题解析• sizeof(数组名)&#xff0c;sizeof中单独放数组名&#xff0c;这⾥的数组名表⽰整个数组&…

MySQL 8.2 Command Line Client闪退

原因一 服务没有打开 原因二 找不到my.ini文件 原因一的解决方法 操作1进入管理 操作2选择服务 1 2 3 操作3选择MySQL服务并打开 原因二的解决方法 查找目录中是否有my.ini文件 C:\Program Files\MySQL\MySQL Server 8.2&#xff08;一般在这个目录下&#xff09; 有时…

Apache Flink(六):Apache Flink快速入门 - Flink案例实现

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

2023/12/3总结

RabbitMq 消息队列 下载地址RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ 使用详情RabbitMQ使用教程(超详细)-CSDN博客 实现延迟队列&#xff08;为了实现订单15分钟后修改状态&#xff09; 1 死信队列 当一个队列中的消息满足下列情况之一时&…

【C#】接口定义和使用知多少

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 最近在封装和参考sdk时&#xff0c;看到一个不错的写法&#xff0c;并且打破自己对接口和实现类固定的观念&#xff0c;这也充分说明自己理解掌握的知识点还不够深。 目录 前言一、什么是…

【C++】类与对象(中)

目录 1. 类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3. 析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5. 赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载 6. const成员 7. 取地址及const取地址操作符重载 1.…

5_企业架构LNMP高可用负载均衡服务器

企业架构LNMP高可用负载均衡服务器之Nginx 学习目标和内容 1、能够描述负载均衡的作用 2、能够了解负载均衡常见实现方式 3、能够使用Nginx实现负载均衡 4、能够描述Nginx的常见负载均衡算法 一、背景描述及其方案设计 1、业务背景描述 时间&#xff1a;2011.6.-2013.9 发布产…

二级分类菜单及三级分类菜单的层级结构返回

前言 在开发投诉分类功能模块时&#xff0c;遇到过这样一个业务场景&#xff1a;后端需要按层级结构返回二级分类菜单所需数据&#xff0c;换言之&#xff0c;将具有父子关系的List结果集数据转为树状结构数据来返回 二级分类菜单 前期准备 这里简单复刻下真实场景中 出现的…

上门按摩APP小程序,抓住机遇创新服务新模式;

上门按摩APP小程序&#xff1a;抓住机遇&#xff0c;创新服务新模式&#xff1b; 随着现代人对生活质量要求的提高&#xff0c;上门按摩服务正成为一种新的、受欢迎的生活方式。通过APP小程序&#xff0c;用户可以轻松预约按摩服务&#xff0c;解决身体疲劳问题&#xff0c;享受…

备战春招——12.3 算法

哈希表 哈希表主要是使用 map、unordered_map、set、unorerdered_set、multi_&#xff0c;完成映射操作&#xff0c;主要是相应的函数。map和set是有序的&#xff0c;使用的是树的形式&#xff0c;unordered_map和unordered_set使用的是散列比表的&#xff0c;无序。 相应函数…

半导体封装之倒装封装 (Flip Chip)

倒装封装 &#xff08;Flipchip&#xff09;是相对于引线键合(Wire Bonding)来说的&#xff0c;之所以叫做倒装&#xff0c;是因为flip chip是正面朝下放置。倒装芯片技术是通过芯片上的凸点直接将元器件朝下互连到基板、载体或者电路板上。引线键合的连接方式是将芯片的正面朝…