Jackson 无法在 Android 上加载 JDK7 类型

Jackson unable to load JDK7 types on Android

我在 Android 应用程序中使用 Jackson 2.8.2 反序列化 JSON。反序列化本身有效,但是,我可以在应用程序日志中看到以下警告:

Unable to load JDK7 types (annotations, java.nio.file.Path): no Java7 support added

Proguard 已禁用,sourceCompatibility 设置为 '1.7'。如何将这些看似缺失的类型添加到我的构建中?

首先,您的 sourceCompatibility 设置 1.7 与运行时环境没有任何关系,因此它不会影响此消息。

这纯粹是一个“在 Jackson 初始化这个 class 时这些 class 是否存在”问题——他们确实 not 存在于某种组合中。也许没关系,如果您不使用 Java 7 java.nio.file.Path class 那么您应该不会遇到此记录的 warning 消息。因为这就是这个警告的意思,Jackson 支持 serialization/deserialization 这个特定的 class。

查看 Android java.nio.* packages,它没有 java.nio.file.*any API 级别。这样就解释了为什么您会看到警告消息。而且由于您无论如何都不能使用 java.nio.file.Path,所以除了烦人的日志消息之外,这甚至不是真正的问题。

如果此消息令人厌烦,您始终可以将记录器 com.fasterxml.jackson.databind.ext.Java7Support 的 Java Util 日志记录级别设置为级别 ERROR。然后您将不会再看到这些 警告 消息。

有关记录消息的更多信息:

在 Jackson 2.8.x 中,对 Java 7 class java.nio.file.Path 的支持都是从同一个 JAR 文件加载的,并且是内置的。一个 class 动态检查另一个是否可以正确加载:

Class<?> cls = Class.forName("com.fasterxml.jackson.databind.ext.Java7SupportImpl");

如果有什么东西从最后一组 class 中剥离了这个 class,这可能会失败的唯一方法。或者运行时缺少它所依赖的 classes 之一:

import java.beans.ConstructorProperties;
import java.beans.Transient;
import java.nio.file.Path;

如果缺少其中任何一个,您将看到记录的错误消息。所以其中一个是正确的:

  • JDK 7 class 中的一个或多个在运行时丢失
  • com.fasterxml.jackson.databind.ext.Java7SupportImpl 在运行时缺失

这些原因都不是 Jackson 的错,它们与您的运行时环境有关(即它们不存在于 Android API 中),或者 Proguard 剥离 class es 它认为没有被使用。

另请参阅:

  • Android import java.nio.file.Files; cannot be resolved
  • How to use java.nio.file package in android?
  • Android java.nio packages