问题描述
引用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,我认为事情可能有点different和像java.time
这样的软件包在某些条件下实际上可以在Java 7中使用。
假设实际上不可能从Java 7(正常,不是android)中使用okhttp 3.12.x,那么更新文档以反映这一点可能会有所帮助,以免其他人我刚刚经历的探索之旅。
>
我创建了带有堆栈跟踪here的要点。第53行的breaking语句是:
client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build()
(删除addInterceptor
调用不能解决问题)
还应该注意,这是一个小型的两类项目,我正在用Java 11构建,然后使用mechanics in later versions of gradle(和Java)来定位Java 7,最后使用以下命令执行胖子上面的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
显示问题的方法,问题现在消失了。