在 Java 7 上使用 OkHttpClient v3.12.x 时无法解析 java.time.Duration 类型

问题描述

我正在开发一个为 Java 7 编译的项目。

在这个项目中,我使用 OkHttpClient v3.12.13,它与 Java 7 兼容(如 here 所述)。但是,这些行会在 Eclipse 编辑器中产生错误

private static final OkHttpClient GLOBAL_OK_HTTP_CLIENT = new OkHttpClient.Builder()
    .readTimeout(10,TimeUnit.SECONDS)
    .build();

错误是这样的:

The type java.time.Duration cannot be resolved. It is indirectly referenced from required .class files

错误仅由编辑器显示。事实上,当我使用 CLI(在 Eclipse 之外)编译我的项目时,我没有收到任何对 java.time 包的隐式引用的错误

我知道在 Java 7 中没有 java.time 包。事实上,我没有在我的代码中使用它,它只是被 OkHttp 库隐式引用(如错误消息所述)。

有没有办法在 Eclipse 上修复这个错误

这是我在 Eclipse 上配置编译器合规性的方式:

Eclipse compiler compliance

请注意,我无法升级到较新的 Java 版本。

解决方法

java.time 类内置于 Java 8 及更高版本中。您正在将您的应用部署到 Java 7。该版本的 Java 缺少由您的代码调用库所调用的 java.time.Duration 类。

您声称库支持 Java 7。如果这是真的,库必须有一个开关以避免使用 Java 7 中不可用的类。

您未正确配置您的 IDE,以允许在比您部署的版本更高的版本中进行编程。这是你应该解决的问题。如果在 Java 7 上部署,则针对 Java 7 进行编译。请参阅问题 how do I get eclipse to use a different compiler version for Java?

当然,最好的解决方案是迁移到 Java 的现代版本。 Java 7 reached end-of-life in 2015-04。我强烈建议改用长期支持 (LTS) 版本。目前是 Java 8 和 Java 11。

如果是您自己使用 java.time 类的代码,我建议将 ThreeTen-Backport 库添加到您的项目中。该库提供了大部分 java.time 功能和几乎相同的 API,可用于 Java 6 和 Java 7。但我猜这不会满足您所讨论的库,尽管您可能想要验证。