Собственная библиотека sqljdbc_auth.dll уже загружена в другой загрузчик классов
У меня есть 2 веб-приложения Java, которые должны подключиться к базе данных SQL Server с помощью встроенной проверки подлинности Windows.
Первый загруженный работает нормально, но второй выдает исключение:
Native Library sqljdbc_auth.dll already loaded in another classloader
Вышеуказанная ошибка возникает, когда я помещаю sqljdbc_auth.dll в одну из папок:
- C: \ WINDOWS \ 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;");
Как я могу решить это?
3 ответа
Каждое веб-приложение имеет свой собственный Classloader (изолирующий их). Когда вы вызываете метод Class.forName(), появляется статический блок, который пытается загрузить общую библиотеку (файл dll) - поэтому оба ваших веб-приложения пытаются загрузить общую библиотеку, поэтому появляется сообщение об ошибке, когда второй пытается загрузить.
Jar-файл JDBC, который у вас есть для sqlserver, должен быть перенесен из комплекта ваших войн в tomcat 7.0/lib
и скопируйте файл sqljdbc_auth.dll в папку tomcat / bin - таким образом, он будет находиться в родительском загрузчике классов tomcat, и класс будет загружен только один раз.
|----------------------------------|
| sqljdbc*.jar --> tomcat*/lib |
|----------------------------------|
| sqljdbc_auth.dll --> tomcat*/bin |
|----------------------------------|
Я думаю, что вы на правильном пути.
Для запуска командной строки вы можете легко решить проблему no sqljdbc_auth в java.library.path, установив переменную среды
CATALINA_OPTS=-Djava.library.path=/path/to/dll
Если вы запускаете tomcat как сервис, измените параметр Options в
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters\Java
включать:
-Djava.library.path=/path/to/dll
Такая же ошибка возникает в 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
И это будет работать.