Ответ 1
Вы не можете загрузить одну и ту же родную библиотеку дважды.
Поместите класс в файл jar под /lib/, он будет разделен на все войны.
У меня есть webapp, работающий под Tomcat 3.2.1, который должен делать вызовы JNI в
для доступа к данным и методам в устаревшем коде С++. Загружен сервлет
на
запуск webapp, который как часть своего метода init
вызывает набор данных
специфичный для этого экземпляра webapp для загрузки в данные С++
структуры.
Этот код Java для этого сервлета содержит следующее:
static
{
try {
System.loadLibrary("JCoreImpl");
System.out.println("JCoreImpl loaded");
m_bLibraryLoaded = true;
} catch (UnsatisfiedLinkError e) {
m_bLibraryLoaded = false;
System.out.println("JCoreImpl NOT loaded " + e);
}
}
Все работает нормально, если есть только один webapp (позвольте ему позвонить "WebApps/ааа" ).
Если у меня есть второй webapp ( "webapps/bbb" ), который идентичен webapps/aaa за исключением набора данных, используемого в структурах данных С++, затем webapps/aaa запускается просто отлично, но когда запускается webapps/bbb, я получаю сообщение об ошибке о том, что:
JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library
E:\WebStation\binDebug\JCoreImpl.dll already loaded in another classloader
Мне нужно иметь отдельный экземпляр родной библиотеки для каждого из моих webapps, поскольку каждый экземпляр должен содержать данные, которые уникальны для этого конкретный webapp. Я просматривал почтовые архивы и читал электронной почты Крейга Макланахана, объясняющего иерархию загрузчиков классов. Но я иметь не удалось найти ничего конкретного для загрузки уникального экземпляра родную библиотеку для каждого webapp.
Вы не можете загрузить одну и ту же родную библиотеку дважды.
Поместите класс в файл jar под /lib/, он будет разделен на все войны.
Смотрите раздел Я сталкиваюсь с проблемами с загрузчиками классов при использовании JNI под Tomcat на вики Tomcat HowTo (http://wiki.apache.org/tomcat/HowTo)
Скопируйте библиотеки DLL во временные файлы во временный каталог перед их загрузкой. Удалите файлы, когда закончите. Таким образом, вы можете гарантировать, что одна и та же DLL не загружается дважды.
У меня была эта проблема, и я решил:
Проблема:
Проблема связана с некоторыми конфигурациями вашего сервера приложений, которые приводят к созданию более чем одного файла war
или ear
, и, следовательно, он создает несколько развернутых файлов. Эти развернутые файлы пытаются получить параллельный доступ к вашей собственной библиотеке, загруженной в статический блок.
Решение:
java
процессы из диспетчера задачjboss-eap-6.4.0\standalone\configuration
и откройте файл standalone.xml
standalone.xml
удалите все теги deployments
(не беспокойтесь, при повторном запуске сервера приложений он вставляет этот тегjboss-eap-6.4.0\standalone\deployments
и удалите все развернутые
файлов и файлов war
. (Вы можете создавать резервные копии ваших военных файлов)exploded