.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»).
- ASP.NET MVC - Медленная начальная загрузка
- Роль / цель ContextLoaderListener весной?
- Log4j, настройка веб-приложения для использования относительного пути
- Что такое файл web.xml и что я могу сделать с ним?
- Как я могу использовать JSON на веб-странице из источника ни с CORS, ни с JSONP?
Если у меня есть второй 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.
- Как запустить EXE с веб-страницы (asp.net)
- Что нужно изучить для создания веб-приложений Java в Java EE 6?
- Stateful EJB в веб-приложении?
- Как разрешить «Ошибка HTTP 500.19 - Внутренняя ошибка сервера» на IIS7.0
- Мое приложение не может открыть ресурс ServletContext
- Как использовать jQuery для события click в веб-приложении iPhone
- Адрес уже используется: JVM_Bind java
- NoClassDefFoundError JsonAutoDetect при анализе объекта JSON
Вы не можете загрузить одну и ту же родную библиотеку дважды.
Поместите class в файл jar под
, он будет разделяться во всех войнах.
Смотрите раздел, в котором я сталкиваюсь с проблемами загрузчика classов при использовании JNI под Tomcat в вики Tomcat HowTo ( http://wiki.apache.org/tomcat/HowTo )
Скопируйте библиотеки DLL во временные файлы во временный каталог перед их загрузкой. Удалите файлы, когда закончите. Таким образом, вы можете гарантировать, что одна и та же DLL не загружается дважды.
У меня была эта проблема, и я решил:
Проблема:
Проблема связана с некоторыми конфигурациями вашего сервера приложений, которые приводят к созданию более одного файла war
или ear
и, следовательно, он создает несколько развернутых файлов. Эти развернутые файлы пытаются иметь параллельный доступ к вашей родной библиотеке, которая загружается в статический блок.
Решение:
- Остановите сервер приложений и закройте IDEA
- Завершить все
java
процессы из диспетчера задач - Перейдите по этому адресу своего сервера приложений:
jboss-eap-6.4.0\standalone\configuration
и откройте файлstandalone.xml
- В
deployments
standalone.xml
удалите все tagsdeployments
(не беспокойтесь, при повторном запуске сервера приложений он вставляет этот тег - Перейдите на этот адрес вашего сервера приложений:
jboss-eap-6.4.0\standalone\deployments
и удалите все развернутые файлы иwar
файлы. (Вы можете создавать резервные копии ваших военных файлов) - Откройте IntelliJ Idea и перейдите по адресу: Edit Configuration JBOSS -> вкладка Deployment
- Удалите текущее развертывание и добавьте новый, который должен быть
exploded