.dll уже загружен в другой загрузчик classов?

У меня есть webapp, работающий под Tomcat 3.2.1, который должен делать вызовы JNI для доступа к данным и методам в устаревшем коде C ++. Сервлет загружается при запуске webapp, который как часть его метода init приводит к тому, что dataset, специфичный для экземпляра Webapp, загружается в структуры данных C ++.

Этот 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 / aaa»).

Если у меня есть второй webapp («webapps / bbb»), который идентичен webapps / aaa, за исключением набора данных, используемого в структурах данных C ++, тогда webapps / aaa запускается просто отлично, но когда запускается webapps / bbb, я получаю ошибка, указывающая, что:

 JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library E:\WebStation\binDebug\JCoreImpl.dll already loaded in another classloader 

Мне нужно иметь отдельный экземпляр родной библиотеки для каждого из моих webapps, так как каждый экземпляр должен содержать данные, которые уникальны для этого конкретного webapp. Я просмотрел почтовые архивы и прочитал письма Крейга МакЛанахана, объяснив иерархию загрузчика classов. Но я не смог найти ничего конкретного для загрузки уникального экземпляра родной библиотеки для каждого webapp.

Вы не можете загрузить одну и ту же родную библиотеку дважды.

Поместите class в файл jar под /lib/ , он будет разделяться во всех войнах.

Смотрите раздел, в котором я сталкиваюсь с проблемами загрузчика classов при использовании JNI под Tomcat в вики Tomcat HowTo ( http://wiki.apache.org/tomcat/HowTo )

Скопируйте библиотеки DLL во временные файлы во временный каталог перед их загрузкой. Удалите файлы, когда закончите. Таким образом, вы можете гарантировать, что одна и та же DLL не загружается дважды.

У меня была эта проблема, и я решил:

Проблема:

Проблема связана с некоторыми конфигурациями вашего сервера приложений, которые приводят к созданию более одного файла war или ear и, следовательно, он создает несколько развернутых файлов. Эти развернутые файлы пытаются иметь параллельный доступ к вашей родной библиотеке, которая загружается в статический блок.

Решение:

  1. Остановите сервер приложений и закройте IDEA
  2. Завершить все java процессы из диспетчера задач
  3. Перейдите по этому адресу своего сервера приложений: jboss-eap-6.4.0\standalone\configuration и откройте файл standalone.xml
  4. В deployments standalone.xml удалите все tags deployments (не беспокойтесь, при повторном запуске сервера приложений он вставляет этот тег
  5. Перейдите на этот адрес вашего сервера приложений: jboss-eap-6.4.0\standalone\deployments и удалите все развернутые файлы и war файлы. (Вы можете создавать резервные копии ваших военных файлов)
  6. Откройте IntelliJ Idea и перейдите по адресу: Edit Configuration JBOSS -> вкладка Deployment
  7. Удалите текущее развертывание и добавьте новый, который должен быть exploded
  • Как отличать сеансы в браузерах?
  • Кто устанавливает тип содержимого ответа в Spring MVC (@ResponseBody)
  • В IndexedDB есть способ сделать отсортированный составной запрос?
  • Рекомендации по созданию и загрузке огромного ZIP (из нескольких BLOB) в WebApp
  • Как развернуть веб-приложение Java (.war) на tomcat?
  • Решение проблемы двойного представления
  • iPhone Web App - остановка прокрутки тела
  • Как преобразовать веб-сайт ASP.NET в веб-приложение ASP.NET
  • Путь к ресурсу в нашей папке war / WEB-INF?
  • Можно ли отключить HttpSession в web.xml?
  • Выполнение стресс-теста в веб-приложении?
  • Давайте будем гением компьютера.