GluonMobile + Jackson = java.lang.NoClassDefFoundError:java.util.function.ToLongFunction

时间:2018-04-19 18:29:43

标签: jackson gluon-mobile

我正在移植需要Jackson到GluonMobile的桌面JavaFx应用程序,这是我第一次使用这个平台,最后我用NoClassDefFoundError结束了下一个堆栈跟踪。

我想知道这是否需要GluonMobile不支持的功能,或者我是否忘记包含正确的内容。

Apr 19, 2018 8:25:02 PM com.fasterxml.jackson.databind.ext.Java7Support <clinit>
WARNING: Unable to load JDK7 types (annotations, java.nio.file.Path): no Java7 support added
[WARN] java.lang.Class: Class.forName() failed to load 'javax.servlet.Servlet'. Use the -forcelinkclasses command line option or add <forceLinkClasses><pattern>javax.servlet.Servlet</pattern></forceLinkClasses> to your robovm.xml file to link it in.
ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
TRACE Task Catching
 java.lang.NoClassDefFoundError: java.util.function.ToLongFunction
at java.lang.VMClassLoader.findClassInClasspathForLoader(Native Method)
at java.lang.PathClassLoader.findClass(PathClassLoader.java:193)
at java.lang.ClassLoader.loadClass(ClassLoader.java:515)
at java.lang.ClassLoader.loadClass(ClassLoader.java:475)
at com.fasterxml.jackson.datatype.jsr310.ser.InstantSerializer.<init>(InstantSerializer.java:38)
at com.fasterxml.jackson.datatype.jsr310.ser.InstantSerializer.<clinit>(InstantSerializer.java:35)
at com.fasterxml.jackson.datatype.jsr310.JavaTimeModule.<init>(JavaTimeModule.java:161)
at com.general.plugin.jackson.json.JacksonObjectMapper.<clinit>(JacksonObjectMapper.java:214)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:218)
at java.lang.Class.forName(Class.java:176)
at com.general.core.startup.Configuration.getSharableInstance(Configuration.java:69)
at com.general.core.startup.AbstractClient.<init>(AbstractClient.java:39)
at com.objectdb.core.startup.Client.<init>(Client.java:31)
at com.objectdb.ui.service.ClientFactory.getDBClient(ClientFactory.java:39)
at com.objectdb.ui.service.ClientTask.getDBClient(ClientTask.java:13)
at com.objectdb.ui.startup.Main$2.call(Main.java:30)
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.lang.Thread.run(Thread.java:837)

1 个答案:

答案 0 :(得分:1)

这个解决方案是一个需要一些工作的解决方法。 将Jackson 2.9.5修复为使用gluon jfxmobile-plugin 1.3.10。

  1. 修复jackson-databind以使用单个构造函数构建不可变对象。
  2. 1.1删除JDK8模块参数名称的使用,因为这需要未实现的VM功能。 请改用java.beans.ConstructorProperties。

    1.2 Jackson用于ConstructorProperties支持JDK8的一些接口,这些接口可作为项目的一部分安全地包含在内。

    java.beans.ConstructorProperties
    java.beans.Transient
    

    1.3强制链接JDK7支持

    forceLinkClasses = [
        'com.fasterxml.jackson.databind.ext.Java7SupportImpl',
    ]
    
    1. 修复jackson-datatype-jsr310。
    2. 2.1它使用了一些可以安全地包含在项目中的JDK8接口。

      java.util.function.ToIntFunction
      java.util.function.ToLongFunction
      

      2.2它使用一些JDK8方法,可以安全地替换JDK6-7实现,只需在项目中包含java文件,并查找Time API的JDK8前端口。

      JavaTimeModule.java
      SerializerToPach.java
      

      3.3将您自己的JavaTimeModule指向您自己的序列化程序。 3.4在ObjectMapper中注册您自己的JavaTimeModule。

      Voila,现在你可以使用lattest Jackson创建不可变对象,并在gluon jfxmobile-plugin 1.x中使用JDK8 Time类。