本机库 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”?

JBoss:Native Library sqljdbc_auth.dll已经加载到另一个类加载器中

win10其中的文件夹或已在另一程序打开

文件删除时提示已在另一程序中打开,查看占用它的程序

无法修改hosts显示已在另一程序打开

文件夹已在另一程序中打开,无法卸载怎么办