本机库sqljdbc_auth.dll已经加载到另一个类加载器中
我有2个Java Web应用程序需要使用Windows集成身份validation连接到SQL Server数据库。
加载的第一个工作正常,但第二个抛出exception:
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应用程序的/ WEB-INF / lib目录
- C:\ Program Files \ Apache Software Foundation \ Tomcat 7.0 \ lib \
两个应用程序抛出exception:
Failed to load the sqljdbc_auth.dll cause :- no sqljdbc_auth in java.library.path
我正在使用此代码加载驱动程序:
Class.forName("jdbc:sqlserver://;databaseName=;integratedSecurity=true;");
我该如何解决?
每个Web应用程序都有自己的Classloader(隔离它们)。 当您调用Class.forName()方法时,有一个静态块正在尝试加载共享库(dll文件) – 因此您的Web应用程序都试图加载共享库,因此第二个时会出现错误消息尝试加载。
您对sqlserver的JDBC jar应该从与您的战争捆绑在一起移动到tomcat 7.0/lib
文件夹并将sqljdbc_auth.dll复制到tomcat / bin文件夹 – 这样它将在tomcat父类加载器和类中只会加载一次。
|----------------------------------| | sqljdbc*.jar --> tomcat*/lib | |----------------------------------| | sqljdbc_auth.dll --> tomcat*/bin | |----------------------------------|
我认为你走在正确的轨道上。
对于命令行启动,您可以通过设置环境变量轻松解决java.library.path问题中的no sqljdbc_auth
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和C:\ Program Files(x86)\ TIBCO \ Jaspersoft Studio-6.1.0.final \ features \ jre.win32.win32.x86.feature_1.7.0.u80 \ jre \ bin中的sqljdbc_auth.dll
它会工作。