繁体   English   中英

在Tomcat8中重新加载应用程序期间,java.lang.UnsatisfiedLinkError本机库已加载到另一个类加载器中

[英]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类的类加载器及其本机库将匹配,并且可以初始化本机方法。

参见: https : //stackoverflow.com/a/372​​13179/8034839

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM