我从本机代码启动JVM,然后启动Jetty。然后,webapp会加载一个名为JPeripheral的库。本机启动器和JPeripheral都依赖于一个名为Jace的本机库。当webapp尝试加载Jace Java抛出时:
java.lang.UnsatisfiedLinkError: Native Library jace.dll already loaded in another classloader
这是webapp中的ClassLoader层次结构:
WebAppClassLoader - > sun.misc.Launcher $ AppClassLoader - > sun.misc.Launcher $的ExtClassLoader
Jace.dll和Jetty都由sun.misc.Launcher$AppClassLoader
加载(由本机启动程序使用)。
JPeripheral由WebAppClassLoader加载。
解决此问题的一种方法是从sun.misc.Launcher$AppClassLoader
加载JPeripheral(因此jace.dll从同一个Classloader加载两次)。我该怎么做?
答案 0 :(得分:1)
事实证明,您可以使用WebAppContext.addSystemClass()强制WebAppClassLoader从父ClassLoader加载JPeripheral。在我的情况下WebAppContext.addSystemClass("org.jperipheral.")
做了伎俩。