我正在移植需要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)
答案 0 :(得分:1)
这个解决方案是一个需要一些工作的解决方法。 将Jackson 2.9.5修复为使用gluon jfxmobile-plugin 1.3.10。
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',
]
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类。