首页 > 解决方案 > 使用来自 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 和一些插件降级到旧版本,并且通常会变得一团糟。可能,但最好不要。

标签: javacompatibilityokhttp

解决方案


回答我自己的问题。在 okhttp 开发人员对为此创建的问题提供了一些反馈后:

https://github.com/square/okhttp/issues/6221

似乎这个问题是由 groovy 使用反射访问/自省引起的。

我添加了CompileStatic注释:

https://docs.groovy-lang.org/latest/html/gapi/groovy/transform/CompileStatic.html

到显示问题的方法,问题现在消失了。


推荐阅读