OkHttpClient报错java.lang.ExceptionInInitializerError at okhttp3.OkHttpClient.<init>

问题

参考《第一行代码》第三版里面的,OkHttpClient使用4.1.0版本报如下的错误:
在这里插入图片描述
java.lang.ExceptionInInitializerError
Caused by: java.lang.IllegalStateException: Expected Android API level 21+ but was 30

解决办法

这个问题可能与版本有关,于是我选择了OkHttpClient最新的版本4.9.3,就没有这个报错了。

implementation 'com.squareup.okhttp3:okhttp:4.9.3'

把4.1.0改成4.9.3,再同步sync一下即可。

你遇到的异常如下: ``` Exception in thread "main" java.lang.ExceptionInInitializerError at io.minio.MinioClient$Builder.<init>(MinioClient.java:2462) at io.minio.MinioClient.builder(MinioClient.java:2454) at com.reachauto.cloud.management.controller.test.main(test.java:14) Caused by: java.lang.RuntimeException: Unsupported OkHttp library found. Must use okhttp >= 4.11.0 at io.minio.S3Base.<clinit>(S3Base.java:107) ... 3 more Caused by: java.lang.NoSuchMethodError: okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody; at io.minio.S3Base.<clinit>(S3Base.java:105) ... 3 more ``` --- ## 🔍 错误原因分析 这个错误的核心是 **依赖版本冲突**,具体来说: > ❌ **你项目中使用的 `OkHttp` 版本太低,不兼容 MinIO Java SDK 所需的 API。** ### 关键线索: ```text java.lang.NoSuchMethodError: okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody; ``` 这表示: MinIO SDK 调用了 `RequestBody.create(byte[], MediaType)` 方法,但当前类路径下的 `OkHttp` 库中 **没有这个方法**。 📌 这个方法是在 **OkHttp 3.12+ 引入,并在 4.x 稳定支持**。 而 MinIO SDK(特别是 v8+)要求使用 **OkHttp ≥ 4.11.0**。 --- ## ✅ 解决方案 ### ✅ 方案一:【推荐】升级 OkHttp 到 4.11.0 或更高版本(Maven) #### 修改 `pom.xml` ```xml <dependencies> <!-- MinIO Java SDK --> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.5.7</version> <!-- 推荐最新稳定版 --> </dependency> <!-- 显式声明 OkHttp 4.11+ --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> <!-- 或更高,如 4.12.0, 5.0.0-alpha --> </dependency> </dependencies> ``` > ⚠️ 注意:不要使用 OkHttp 5.x 正式版(尚未发布),可用 alpha 版测试。 --- ### ✅ 方案二:排除传递依赖中的旧版 OkHttp 如果你引入了其他库(比如 Retrofit、Feign、Spring Cloud OpenFeign),它们可能自带老版本 OkHttp。 #### 使用 Maven 排除旧版本: ```xml <dependency> <groupId>some.other.library</groupId> <artifactId>example-lib</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> </exclusion> </exclusions> </dependency> <!-- 然后显式引入新版 --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> </dependency> ``` --- ### ✅ 方案三:Gradle 用户解决方案 ```groovy dependencies { implementation &#39;io.minio:minio:8.5.7&#39; implementation &#39;com.squareup.okhttp3:okhttp:4.12.0&#39; // 强制使用指定版本(即使被其他库传递引入) configurations.all { resolutionStrategy { force &#39;com.squareup.okhttp3:okhttp:4.12.0&#39; } } } ``` --- ## 🧪 验证是否修复成功 写一个简单的测试程序: ```java import io.minio.MinioClient; public class test { public static void main(String[] args) { MinioClient client = MinioClient.builder() .endpoint("http://localhost:9000") .credentials("minioadmin", "minioadmin") .build(); System.out.println("MinIO Client created successfully."); } } ``` ✅ 如果输出 `"created successfully"`,说明问题解决。 --- ## 🔬 如何检查当前项目的 OkHttp 实际版本? ### 方法一:Maven 命令行查看依赖树 ```bash mvn dependency:tree | grep okhttp ``` 输出示例: ``` [INFO] \- com.squareup.okhttp3:okhttp:jar:3.14.9:compile ``` ⚠️ 如果显示的是 `3.x`,就必须升级! --- ### 方法二:运行时打印版本(Java 代码) ```java System.out.println("OkHttp Version: " + okhttp3.OkHttpClient.class.getPackage().getImplementationVersion()); ``` 如果返回 `null`,说明版本信息缺失(常见于老版本或被重打包)。 --- ## 📌 补充说明:MinIO SDK 对 OkHttp 的依赖关系 | MinIO Java SDK 版本 | 要求 OkHttp 版本 | |---------------------|------------------| | v7.x | OkHttp 3.12+ | | v8.0+ | OkHttp 4.9+ | | v8.3+ | 建议 ≥ 4.11.0 | 👉 官方文档建议始终使用最新的 **4.x 系列**。 --- ## ✅ 总结 | 问题 | 解决方式 | |------|----------| | `NoSuchMethodError: RequestBody.create` | 当前 OkHttp 太旧 | | `Unsupported OkHttp library found` | 版本低于 4.11.0 | | 第三方库带入旧版 | 使用 `<exclusions>` 或 `resolutionStrategy.force` | | 最佳实践 | 显式引入 `okhttp:4.12.0` 并确保其为唯一版本 | ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值