强制Jetty在父ClassLoader中加载类

时间:2011-11-04 15:23:12

标签: java java-native-interface jetty

我从本机代码启动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加载两次)。我该怎么做?

1 个答案:

答案 0 :(得分:1)

事实证明,您可以使用WebAppContext.addSystemClass()强制WebAppClassLoader从父ClassLoader加载JPeripheral。在我的情况下WebAppContext.addSystemClass("org.jperipheral.")做了伎俩。