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

问题背景

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

XML 复制代码
 <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>8.5.2</version>
 </dependency>

结果运行报错:

XML 复制代码
Caused by: java.lang.RuntimeException: Unsupported OkHttp library found. Must use okhttp >= 4.8.1
	at io.minio.S3Base.<clinit>(S3Base.java:106)
	... 50 common frames omitted
Caused by: java.lang.NoSuchMethodError: kotlin.collections.ArraysKt.copyInto([B[BIII)[B
	at 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依赖,再引入所需依赖,如下所示

XML 复制代码
<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的版本冲突导致的。

  1. 继续查呀查,学会看依赖树了。发现此时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 依赖。

XML 复制代码
<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博客

相关推荐
Kapaseker14 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
A0微声z3 天前
Kotlin Multiplatform (KMP) 中使用 Protobuf
kotlin
alexhilton3 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
lhDream3 天前
Kotlin 开发者必看!JetBrains 开源 LLM 框架 Koog 快速上手指南(含示例)
kotlin
RdoZam3 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin
Kapaseker4 天前
研究表明,开发者对Kotlin集合的了解不到 20%
android·kotlin
糖猫猫cc4 天前
Kite:两种方式实现动态表名
java·kotlin·orm·kite
逍遥德4 天前
Maven教程.02-基础-pom.xml 使用标签大全
java·后端·maven·软件构建
逍遥德5 天前
Maven教程.01- settings.xml 文件<profile>使用详解
xml·java·maven
如此风景5 天前
kotlin协程学习小计
android·kotlin