Подтвердить что ты не робот

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

У меня есть 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.

4b9b3361

Ответ 1

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

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

Ответ 3

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

Ответ 4

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

Проблема:

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

Решение:

  • Остановите сервер приложений и закройте IDEA
  • Завершить все java процессы из диспетчера задач
  • Перейдите к этому адресу вашего сервера приложений: jboss-eap-6.4.0\standalone\configuration и откройте файл standalone.xml
  • В standalone.xml удалите все теги deployments (не беспокойтесь, при повторном запуске сервера приложений он вставляет этот тег
  • Перейдите на этот адрес вашего сервера приложений: jboss-eap-6.4.0\standalone\deployments и удалите все развернутые файлов и файлов war. (Вы можете создавать резервные копии ваших военных файлов)
  • Откройте IntelliJ Idea и перейдите по адресу: Edit Configuration JBOSS → вкладка развертывания
  • Удалить текущее развертывание и добавить новый, который должен быть exploded