Принуждение Jetty для загрузки классов в родительском ClassLoader - PullRequest
1 голос
/ 04 ноября 2011

Я запускаю JVM из собственного кода, затем запускаю Jetty. Затем веб-приложение загружает библиотеку под названием JPeripheral. И нативная программа запуска, и JPeripheral зависят от нативной библиотеки под названием Jace. Когда веб-приложение пытается загрузить Jace Java, выдает:

java.lang.UnsatisfiedLinkError: Native Library jace.dll already loaded in another classloader

Вот иерархия ClassLoader внутри веб-приложения:

WebAppClassLoader -> sun.misc.Launcher $ AppClassLoader -> sun.misc.Launcher $ ExtClassLoader

Jace.dll и Jetty загружаются sun.misc.Launcher$AppClassLoader (используется родным средством запуска). JPeripheral загружается WebAppClassLoader.

Одним из способов решения этой проблемы является загрузка JPeripheral из sun.misc.Launcher$AppClassLoader (поэтому jace.dll загружается дважды из одного и того же загрузчика классов). Как мне это сделать?

1 Ответ

1 голос
/ 04 ноября 2011

Оказывается, вы можете заставить WebAppClassLoader загружать JPeripheral из родительского ClassLoader, используя WebAppContext.addSystemClass (). В моем случае WebAppContext.addSystemClass("org.jperipheral.") сделал свое дело.

...