Исходный ответ Адама Баткина приведет вас к решению, но если вы повторно развернете свое веб-приложение (без перезапуска веб-контейнера), вы должны столкнуться со следующей ошибкой:
java.lang.UnsatisfiedLinkError: Native Library "foo" already loaded in another classloader
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1715)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1646)
at java.lang.Runtime.load0(Runtime.java:787)
at java.lang.System.load(System.java:1022)
Это происходит потому, что ClassLoader, который изначально загрузил вашу DLL, по-прежнему ссылается на эту DLL. Однако ваше веб-приложение теперь работает с новым ClassLoader, и поскольку работает та же самая JVM, а JVM не допускает двух ссылок на одну и ту же DLL, вы не можете перезагрузить ее. Таким образом, ваше веб-приложение не может получить доступ к существующей DLL и не может загрузить новую. Итак .... вы застряли.
Документация Tomcat ClassLoader объясняет, почему ваше перезагруженное веб-приложение работает в новом изолированном ClassLoader и как можно обойти это ограничение (на очень высоком уровне).
Решение состоит в том, чтобы немного расширить решение Адама Баткина:
package awesome;
public class Foo {
static {
System.loadLibrary('foo');
}
public static void main(String[] args) {
}
}
Затем поместите банку, содержащую ТОЛЬКО этот скомпилированный класс, в папку TOMCAT_HOME / lib.
Теперь в вашем веб-приложении вам просто нужно заставить Tomcat ссылаться на этот класс, что можно сделать так просто:
Class.forName("awesome.Foo");
Теперь ваша DLL должна быть загружена в общий загрузчик классов, и на нее можно ссылаться из вашего веб-приложения даже после повторного развертывания.
Есть смысл?
Рабочую справочную копию можно найти в коде Google, static-dll-bootstrapper .