![](/img/trans.png)
[英]java.lang.UnsatisfiedLinkError: Native Library sqljdbc_auth.dll already loaded in another classloader
[英]java.lang.UnsatisfiedLinkError Native Library already loaded in another classloader during app reload in Tomcat8
我有一个在Tomcat8中运行的Java Web应用程序。 我将本机库存储在Tomcat安装的/ bin文件夹中。
我使用JNA加载库
Native.loadLibrary("myLib",MyLib.class);
如果我必须更新或重新加载它可以正常运行的应用程序,则可以正常工作。
我的问题是拥有自己的本地库的第三方库。 我将其存储在相同的/ bin目录中,并且可以工作,但是当我重新加载应用程序Tomcat时,由于以下错误而无法加载:
java.lang.UnsatisfiedLinkError: Native Library ...already loaded in another classloader
如果我重新启动tomcat服务,它将再次起作用。 我仅在应用程序重新加载期间发现了此问题。
反编译第三方库,我发现它的本机库已通过以下命令加载:
System.loadLibrary("thirdpartylib");
在重新加载应用程序的情况下,如何在没有UnsatisfiedLinkError的情况下强制在tomcat级别加载此库?
这实际上可能不是答案,但是评论太长了。
您是否已阅读有关Tomcat类加载器问题的信息 ? 这似乎完全符合您的问题。
如果那不能解决问题,您可能不知道(或不说) 其他 ClassLoader已经加载了本机库。 这是Tomcat模块中的设置吗?如果可以,您可以禁用它吗?
由于第三方希望加载其自己的本机库,因此很难解决。 如果查看System.loadLibrary()的源代码:
public static void loadLibrary(String libname) {
Runtime.getRuntime().loadLibrary0(Reflection.getCallerClass(), libname);
}
您可以看到它将使用调用类的ClassLoader,在这种情况下,该类是第三方库的类。 因此,要解决此问题,您需要将第三方库的ClassLoader与尝试首先加载本机库的ClassLoader对齐。 您可以尝试启用类加载跟踪,并查找何时加载了第三方类,然后从那里进行备份以查找ClassLoader。
尝试将myLib
更改为另一个名称,例如myLib_2
,以避免发生冲突。
如果是相同的共享库,请尝试以下方法:
为了使“正确的”类加载器加载本机库,您可以使用仅执行loadLibrary的单个静态方法创建一个微型类。 将此类放在一个额外的jar中,然后将此jar放在共享的Tomcat目录中。 然后在Web应用程序中,将对System.loadLibrary的调用替换为对新的静态方法的调用。 这样,OpenCV类的类加载器及其本机库将匹配,并且可以初始化本机方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.