杰克逊无法在Android上加载JDK7类型

时间:2016-09-10 11:31:12

标签: java android jackson java-7 kotlin

我在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 个答案:

答案 0 :(得分:18)

首先,您sourceCompatibility的{​​{1}}设置对运行时环境没有任何意义,因此它对此消息没有任何影响。

这纯粹是" 这些类在杰克逊初始化这个类时存在"问题 - 他们在某些组合中存在。也许没关系,如果你不使用Java 7 1.7类,那么你应该对这个记录的警告消息没有任何问题。因为这就是这个警告的内容,杰克逊支持这个特定类的序列化/反序列化。

查看Android java.nio.* packages,它在任何 API级别没有java.nio.file.Path个包。这就解释了为什么你会看到警告信息。既然你无论如何都不能使用java.nio.file.*,除了令人讨厌的日志消息之外,这甚至都不是真正的问题。

如果此消息很麻烦,您始终可以将记录器java.nio.file.Path的Java Util Logging级别设置为级别com.fasterxml.jackson.databind.ext.Java7Support。然后,您将不会再看到这些警告消息。

有关已记录消息的详细信息:

在Jackson 2.8.x中,对Java 7类ERROR的这种支持都是从同一个JAR文件加载而且是内置的。一个类动态检查另一个是否可以加载而不会出错:

java.nio.file.Path

这种失败的唯一方法就是从最终的一组类中剥离这个类。或者运行时缺少这些依赖的类之一:

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

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

  • 运行时缺少一个或多个JDK 7类
  • 运行时缺少
  • import java.beans.ConstructorProperties; import java.beans.Transient; import java.nio.file.Path;

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

另见: