记录minio、okhttp、kotlin一连环的版本冲突问题

news/2024/4/28 18:35:25

问题背景

项目中需要引入minio,添加了如下依赖

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

结果运行报错:

Caused by: java.lang.RuntimeException: Unsupported OkHttp library found. Must use okhttp >= 4.8.1at io.minio.S3Base.<clinit>(S3Base.java:106)... 50 common frames omitted
Caused by: java.lang.NoSuchMethodError: kotlin.collections.ArraysKt.copyInto([B[BIII)[Bat okio.Segment.writeTo(Segment.kt:169)at okio.Segment.compact(Segment.kt:152)at okio.Buffer.write(Buffer.kt:1854)at okio.Buffer.read(Buffer.kt:1865)at okio.Buffer.writeAll(Buffer.kt:1655)at okio.Options$Companion.buildTrieRecursive(Options.kt:187)at okio.Options$Companion.buildTrieRecursive(Options.kt:174)at okio.Options$Companion.buildTrieRecursive$default(Options.kt:113)at okio.Options$Companion.of(Options.kt:72)at okhttp3.internal.Util.<clinit>(Util.kt:72)at okhttp3.RequestBody$Companion.create(RequestBody.kt:145)at okhttp3.RequestBody$Companion.create$default(RequestBody.kt:143)at okhttp3.RequestBody.create(RequestBody.kt)at io.minio.S3Base.<clinit>(S3Base.java:104)... 50 common frames omitted

解决过程

1. 看到Unsupported OkHttp library found. Must use okhttp >= 4.8.1,以为是之前引入的okhttp的版本太低,于是将 okhttp 升到 4.8.1 ,还是报同样错误

2. 上网查了一下,说需要在minio的依赖中排除okhttp依赖,再引入所需依赖,如下所示

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</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.8.1</version>
</dependency>

还是不行。这时仍坚定地以为是okhttp的版本冲突导致的。

3. 继续查呀查,学会看依赖树了。发现此时okhttp应该没有冲突了。

那是什么原因呢?突然,注意到了报错信息中的NoSuchMethodError: kotlin.collections.ArraysKt.copyInto。于是搜索kotlin,发现最终元凶。应该是okhttp中的okio依赖的 kotlin 是1.3.70版本的,而实际依赖的 kotlin 是1.2.71版本的,所以在ArraysKt中找不到copyInto方法。

解决办法

minio 的依赖中排除 okhttp 依赖,再单独引入所需的 okhttp 依赖。在引入的 okhttp 的依赖中排除 kotlin  的依赖,再单独引入所需 kotlin 依赖。

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</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.8.1</version><exclusions><exclusion><artifactId>kotlin-stdlib</artifactId><groupId>org.jetbrains.kotlin</groupId></exclusion></exclusions>
</dependency><dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-stdlib</artifactId><version>1.3.70</version>
</dependency>

后话 

作为maven白痴,之前遇到依赖冲突的问题都不知从何下手。这次在寻找解决办法的过程中,对maven的了解更加深入了。了解到之前okhttp错误依赖的kotlin版本可能是在spring的 DependencyManagement中指定的,解决办法就是先排除这个依赖,再单独添加依赖并指定版本。

参考资料

1. springboot项目 minio okhttp版本依赖问题_unsupported okhttp library found. must use okhttp -CSDN博客

2. 记录Maven 依赖包版本号奇奇怪怪的问题 - okhttp3、okio 版本指定无效_okio maven-CSDN博客


http://wed.xjx100/news/1263612.html

相关文章

flink on yarn-per job源码解析、flink on k8s介绍

Flink 架构概览–JobManager JobManager的功能主要有: 将 JobGraph 转换成 Execution Graph,最终将 Execution Graph 拿来运行Scheduler 组件负责 Task 的调度Checkpoint Coordinator 组件负责协调整个任务的 Checkpoint,包括 Checkpoint 的开始和完成通过 Actor System 与 …

Git命令上传本地项目至github

记录如何创建个人仓库并上传已有代码至github in MacOS环境 0. 首先下载git 方法很多 这里就不介绍了 1. Github Create a new repository 先在github上创建一个空仓库&#xff0c;用于一会儿链接项目文件&#xff0c;按照自己的需求设置name和是否private 2.push an exis…

vue组件弹窗窗

import { createApp } from vue; import { Popup } from vant;const app createApp(); app.use(Popup); 有这样的一个效果 在手机上很美观 不错 建议大家使用

基于Mac M1[ARM64]环境下Docker部署大数据集群

注意&#xff1a;打开新环境需要手动同步环境变量 一 机器依赖(CentOS7)[重要] yum -y install \ vim \ sudo \ net-tools.aarch64 \ nmap-ncat.aarch64 \ telnet \ openssh-server \ openssh-clients初始化sshd文件&#xff0c;如果不初始化下边文件&#xff0c;sshd服务会启…

iOS —— 初识KVO

iOS —— 初始KVO KVO的基础1. KVO概念2. KVO使用步骤注册KVO监听实现KVO监听销毁KVO监听 3. KVO基本用法4. KVO传值禁止KVO的方法 注意事项&#xff1a; KVO的基础 1. KVO概念 KVO是一种开发模式&#xff0c;它的全称是Key-Value Observing (观察者模式) 是苹果Fundation框架…

HTTP——Cookie

HTTP——Cookie 什么是Cookie通过Cookie访问网站 我们之前了解了HTTP协议&#xff0c;如果还有小伙伴还不清楚HTTP协议&#xff0c;可以点击这里&#xff1a; https://blog.csdn.net/qq_67693066/article/details/136895597 我们今天来稍微了解一下HTTP里面一个很小的部分&…

TitanIDE与传统 IDE 比较

与传统IDE的比较 TitanIDE 和传统 IDE 属于不同时代的产物&#xff0c;在手工作坊时代&#xff0c;一切都是那么的自然&#xff0c;开发者习惯 Windows 或 MacOS 原生 IDE。不过&#xff0c;随着时代的变迁&#xff0c;软件行业已经步入云原生时代&#xff0c;TitanIDE 是顺应…

【网安小白成长之路】3.MySQL环境配置以及常用命令(增删改查)

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…