本机库 sqljdbc_auth.dll 已在另一个类加载器中加载
Posted
技术标签:
【中文标题】本机库 sqljdbc_auth.dll 已在另一个类加载器中加载【英文标题】:Native Library sqljdbc_auth.dll already loaded in another classloader 【发布时间】:2012-05-25 03:21:31 【问题描述】:我有 2 个 Java Web 应用程序需要使用 Windows 集成身份验证连接到 SQL Server 数据库。
第一个加载的工作正常,但第二个抛出异常:
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 各个web应用的目录 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;");
我该如何解决?
【问题讨论】:
【参考方案1】:每个 Web 应用程序都有自己的 Classloader(隔离它们)。当您调用 Class.forName() 方法时,有一个静态块正在尝试加载共享库(dll 文件)-因此您的两个 Web 应用程序都在尝试加载共享库,因此第二个时出现错误消息尝试加载。
您为 sqlserver 拥有的 JDBC jar 应该从与您的 war 捆绑在一起移动到 tomcat 7.0/lib
文件夹并将 sqljdbc_auth.dll 复制到 tomcat/bin 文件夹 - 这样它将在 tomcat 父类加载器中,并且该类只会被加载一次。
|----------------------------------|
| sqljdbc*.jar --> tomcat*/lib |
|----------------------------------|
| sqljdbc_auth.dll --> tomcat*/bin |
|----------------------------------|
【讨论】:
正如我在问题中所说,我之前尝试将 DLL 放入 tomcat 7.0/lib 中。在您回答之后,我创建了 tomcat 7.0/libs 并将 DLL 放在那里,我得到了同样的错误:无法加载 sqljdbc_auth.dll 原因:- java.library.path 中没有 sqljdbc_auth 我之前在链接中读过 Tomcat 类加载器:tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html 但似乎 Tomcat 只加载 .jar 文件,而不加载 .dll 文件。 好的,澄清一下,你需要将dll放在Tomcat/bin文件夹中,将jdbc JAR文件放在Tomcat/lib文件夹中(对不起,我在额外的s 在 lib 上,我现在已经更正了) 另外,Tomcat加载jar文件,然后加载dll文件(但是classpath和native library路径不同) 很好的解释,谢谢!除了将jar
添加到tomcat*/lib
文件夹之外,还需要从应用程序的依赖项中删除jar
。然后使用具有集成安全性的多个应用程序按预期工作!【参考方案2】:
我认为你在正确的轨道上。
对于命令行启动,您可以通过设置环境变量轻松解决 no sqljdbc_auth in 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
【讨论】:
【参考方案3】: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\ 中的 sqljdbc_auth.dll垃圾箱
它会起作用的。
【讨论】:
以上是关于本机库 sqljdbc_auth.dll 已在另一个类加载器中加载的主要内容,如果未能解决你的问题,请参考以下文章
libGDX / roboVM:如何修复“已在另一个类加载器中加载的本机库libhfscompressor.dylib”?