Оригінальна відповідь Адама Баткіна приведе вас до рішення, але якщо ви передислокуєте свій веб-додаток (без перезапуску веб-контейнера), у вас може виникнути така помилка:
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 не дозволяє 2 посилання на одну і ту ж DLL, ви не можете перезавантажити його. Таким чином, ваш веб-додаток не може отримати доступ до існуючої DLL і не може завантажити нову. Отже .... ти застряг.
Документація Tomcat's ClassLoader описує, чому ваш перезавантажений працює в новому ізольованому ClassLoader, і як ви можете обійти це обмеження (на дуже високому рівні).
Рішення полягає в тому, щоб трохи розширити рішення Адама Баткіна:
package awesome;
public class Foo {
static {
System.loadLibrary('foo');
}
// required to work with JDK 6 and JDK 7
public static void main(String[] args) {
}
}
Потім помістіть банку, що містить JUST цей скомпільований клас, у папку TOMCAT_HOME / lib.
Тепер у вашому веб-додатку вам просто потрібно змусити Tomcat посилатися на цей клас, що можна зробити так просто, як це:
Class.forName("awesome.Foo");
Тепер ваша DLL повинна бути завантажена в загальний завантажувач класів, і на неї можна посилатись із вашого веб-додатка навіть після повторного розгортання.
Мати сенс?
Робочу довідкову копію можна знайти в коді Google, static-dll-bootstrapper .