从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,我认为事情可能有点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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...