java - 使用来自 java 7 的 okhttp 3.12.x?
问题描述
引用 okhttp github 页面:
OkHttp 3.12.x 分支支持 Android 2.3+(API 级别 9+)和 Java 7+
但是查看com.squareup.okhttp3:okhttp:3.12.12
(似乎是撰写本文时最新的 3.12.x 版本),我们发现以下内容:
import java.time.Duration; // OkHttpClient.java line 23
以及 Duration 的各种用途,这是 java 8 的一个特性。这使我的代码在运行时中断:
java.lang.ClassNotFoundException: java.time.Duration
运行时:
java version "1.7.0_251"
Java(TM) SE Runtime Environment (build 1.7.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 24.251-b08, mixed mode)
这是我的目标环境中的硬性要求。
实际上是否有一个与 java 7 兼容的不错的最新版本的 okhttp?
我阅读茶叶的方式(不是在文档中)是 3.12.x 分支主要用于支持 android,我认为情况可能略有不同java.time
,并且在某些条件下,Java 7 中实际上可以使用类似的包。
假设实际上不可能使用 java 7 中的 okhttp 3.12.x(正常,而不是 android),最好更新文档以反映这一点,以节省其他人我刚刚经历的探索之旅。
< 编辑 - 在 yuri 回复后添加的评论 >
我在这里创建了一个带有堆栈跟踪的要点。第 53 行的中断语句是:
client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build()
(删除addInterceptor
呼叫并不能解决问题)
还应该注意的是,这是一个小型的两类项目,我正在使用 java 11 构建,然后使用更高版本的 gradle(和 java)中的机制来定位 java 7,最后用上面的方法执行 fat jar Java 7 版本。引用 gradle 描述:
从版本 9 开始,Java 编译器可以配置为为较旧的 Java 版本生成字节码,同时确保代码不使用更新版本的任何 API。
所以我正在构建:
------------------------------------------------------------
Gradle 6.6
------------------------------------------------------------
Build time: 2020-08-10 22:06:19 UTC
Revision: d119144684a0c301aea027b79857815659e431b9
Kotlin: 1.3.72
Groovy: 2.5.12
Ant: Apache Ant(TM) version 1.10.8 compiled on May 10 2020
JVM: 11.0.7 (Amazon.com Inc. 11.0.7+10-LTS)
OS: Mac OS X 10.15.5 x86_64
并使用上述 oracle java 7 运行。
我使用 java 11 构建的原因是,使用 java 7 构建迫使我将 gradle 和一些插件降级到旧版本,并且通常会变得一团糟。可能,但最好不要。
解决方案
回答我自己的问题。在 okhttp 开发人员对为此创建的问题提供了一些反馈后:
https://github.com/square/okhttp/issues/6221
似乎这个问题是由 groovy 使用反射访问/自省引起的。
我添加了CompileStatic
注释:
https://docs.groovy-lang.org/latest/html/gapi/groovy/transform/CompileStatic.html
到显示问题的方法,问题现在消失了。
推荐阅读
- regex - 在 Go 中字符串末尾的正则表达式匹配失败
- tableau-api - 根据计算字段过滤数据
- java - 为什么我的操作结果与我在java中的计算器不同
- python - 具有多个未嵌套子文件夹的 mkdir
- java - 无法使用 @RequestMapping 从backbone.js 表单获取数据到Spring MVC 模型
- c# - 重构函数,使其为 O(N)
- node.js - Firestore 事务在单个事务中更新多个集合
- javascript - 在 postman-test 部分,我们可以读取 excel 并获取数据以进行验证吗?
- regex - 使用 arg + uri 进行 Htaccess 内部重写
- c++ - 如何处理从 Gdiplus::DrawArc 返回的零星 OutOfMemory 错误代码?