Собственная библиотека sqljdbc_auth.dll уже загружена в другой загрузчик классов

У меня есть 2 веб-приложения Java, которым необходимо подключиться к базе данных SQL Server с помощью встроенной проверки подлинности Windows.

Первый загруженный работает нормально, но второй выдает исключение:

Native Library sqljdbc_auth.dll already loaded in another classloader

Вышеупомянутая ошибка возникает, когда я помещаю sqljdbc_auth.dll в одну из папок:

  • C: \ ОКНА \ system32 \
  • C: \ Program Files \ Apache Software Foundation \ Tomcat 7.0 \ bin \

Если я помещу sqljdbc_auth.dll в одну из следующих папок:

  • / WEB-INF / lib каталог каждого веб-приложения
  • C: \ Program Files \ Apache Software Foundation \ Tomcat 7.0 \ lib \

Оба приложения выдают исключение:

Failed to load the sqljdbc_auth.dll cause :- no sqljdbc_auth in java.library.path

Я использую этот код для загрузки драйвера:

Class.forName("jdbc:sqlserver://<HOST>;databaseName=<DBNAME>;integratedSecurity=true;");

Как я могу это решить?


person Gustavo    schedule 17.05.2012    source источник


Ответы (3)


У каждого веб-приложения есть собственный загрузчик классов (изолирующий их). Когда вы вызываете метод Class.forName (), есть статический блок, который пытается загрузить общую библиотеку (файл dll), поэтому оба ваших веб-приложения пытаются загрузить общую библиотеку, следовательно, сообщение об ошибке, когда второе попытки загрузить.

JDBC jar, который у вас есть для sqlserver, следует переместить из связанного с вашими войнами в папку tomcat 7.0/lib и скопировать sqljdbc_auth.dll в папку tomcat / bin - таким образом он будет в родительском загрузчике классов tomcat, а класс будет только загружается один раз.

|----------------------------------|
| sqljdbc*.jar     --> tomcat*/lib |
|----------------------------------|
| sqljdbc_auth.dll --> tomcat*/bin |
|----------------------------------|
person Chris White    schedule 17.05.2012
comment
Как я уже сказал в своем вопросе, я раньше пытался поместить DLL в tomcat 7.0 / lib. После вашего ответа я создал tomcat 7.0 / lib s и поместил туда DLL, и у меня такая же ошибка: не удалось загрузить sqljdbc_auth.dll причина: - нет sqljdbc_auth в java.library.path - person Gustavo; 18.05.2012
comment
Я читал о загрузчике классов Tomcat раньше по ссылке: tomcat .apache.org / tomcat-7.0-doc / class-loader-howto.html Но кажется, что Tomcat загружает только файлы .jar, а не файлы .dll. - person Gustavo; 18.05.2012
comment
Хорошо, чтобы уточнить, вам нужно поместить dll в папку Tomcat / bin и файл jdbc JAR в папку Tomcat / lib (извините, моя ошибка с дополнительными s в lib, которые у меня сейчас исправил) - person Chris White; 18.05.2012
comment
Кроме того, Tomcat загружает файлы jar, которые затем, в свою очередь, загружают файл dll (но путь к классам и пути к собственной библиотеке отличаются) - person Chris White; 18.05.2012
comment
Хорошее объяснение, спасибо! Помимо добавления jar в папку tomcat*/lib, необходимо удалить jar из зависимостей приложения. Тогда использование нескольких приложений со встроенной безопасностью работает должным образом! - person phylib; 20.02.2020

Я думаю, вы на правильном пути.

Для запуска из командной строки вы можете легко решить проблему no sqljdbc_auth в java.library.path, установив переменную среды

CATALINA_OPTS=-Djava.library.path=/path/to/dll

Если вы используете Tomcat как службу, измените параметр Параметры в разделе

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters\Java

включать:

-Djava.library.path=/path/to/dll
person pd40    schedule 18.05.2012

Та же ошибка возникает в Jasper Studio.

Вероятно, не лучшее решение, но поместите sqljdbc4.jar в C: \ Program Files (x86) \ TIBCO \ Jaspersoft Studio-6.1.0.final \ features \ jre.win32.win32.x86.feature_1.7.0.u80 \ jre \ lib \ ext и sqljdbc_auth.dll в C: \ Program Files (x86) \ TIBCO \ Jaspersoft Studio-6.1.0.final \ features \ jre.win32.win32.x86.feature_1.7.0.u80 \ jre \ bin

И это сработает.

person shailendra sharma    schedule 24.08.2016