我在我的 Android 应用中使用 Jackson 2.8.2 来反序列化 JSON。反序列化本身可以工作,但是,我可以在应用程序日志中看到以下警告:
Unable to load JDK7 types (annotations, java.nio.file.Path): no Java7 support added
Proguard 已禁用,sourceCompatibility
设置为 '1.7'
。如何将这些看似缺失的类型添加到我的构建中?
最佳答案
首先,您的 1.7
的 sourceCompatibility
设置对运行时环境没有任何意义,因此对这条消息没有影响。
这纯粹是一个“这些类在 Jackson 初始化这个类时是否存在”问题——它们确实不以某种组合存在。也许没关系,如果您不使用 Java 7 java.nio.file.Path
类,那么您应该不会对这个记录的 warning 消息有任何问题。因为这就是这个警告的内容,Jackson 支持这个特定类的序列化/反序列化。
看Android java.nio.*
packages ,它在 any API 级别没有 java.nio.file.*
包。这就解释了为什么您会看到警告消息。而且由于您无论如何都不能使用 java.nio.file.Path
,除了烦人的日志消息之外,这甚至不是真正的问题。
如果此消息令人讨厌,您始终可以将记录器 com.fasterxml.jackson.databind.ext.Java7Support
的 Java Util Logging 级别设置为级别 ERROR
。然后您将不再看到这些警告消息。
有关记录消息的更多信息:
在 Jackson 2.8.x 中,对 Java 7 类 java.nio.file.Path
的支持都是从同一个 JAR 文件加载的,并且是内置的。一个类动态检查另一个类是否可以正确加载:
Class<?> cls = Class.forName("com.fasterxml.jackson.databind.ext.Java7SupportImpl");
这可能失败的唯一方法是,如果有什么东西从最后一组类中剥离了这个类。或者它所依赖的这些类之一从运行时中丢失:
import java.beans.ConstructorProperties;
import java.beans.Transient;
import java.nio.file.Path;
如果缺少其中任何一个,您将看到记录的错误消息。所以其中之一是正确的:
- 运行时缺少一个或多个 JDK 7 类
com.fasterxml.jackson.databind.ext.Java7SupportImpl
在运行时丢失
这些原因都不是 Jackson 的错,它们与您的运行时环境有关(即它们不存在于 Android API 中),或者它认为没有使用的 Proguard 剥离类。
另见:
关于java - Jackson 无法在 Android 上加载 JDK7 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39425594/