代码之家  ›  专栏  ›  技术社区  ›  Tobia

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

  •  0
  • Tobia  · 技术社区  · 6 年前

    我将本机库存储在Tomcat安装的/bin文件夹中。

    Native.loadLibrary("myLib",MyLib.class);
    

    如果我必须更新或重新加载应用程序,它可以正常工作。

    我将它存储在同一个/bin目录中,它可以工作,但是当我重新加载应用程序时,Tomcat无法加载,并出现以下错误:

    java.lang.UnsatisfiedLinkError: Native Library ...already loaded in another classloader
    

    反编译第三方库时,我发现其本机库已使用以下命令加载:

    System.loadLibrary("thirdpartylib");
    

    2 回复  |  直到 6 年前
        1
  •  1
  •   Wheezil    6 年前

    这可能不是一个真正的答案,但它太长了,无法发表评论。

    你读过吗 about Tomcat classloader problems

    如果这不能解决问题。。。你不知道(或不说)的是 ClassLoader已经加载了本机库。这是Tomcat模块中的一个设置吗?如果是,您可以禁用它吗?

    public static void loadLibrary(String libname) {
        Runtime.getRuntime().loadLibrary0(Reflection.getCallerClass(), libname);
    }
    

    您可以看到它将使用 ,在本例中是第三方库的类。因此要解决这个问题,您需要将第三方库的类加载器与试图首先加载本机库的类加载器对齐。你可以试试 enabling class loading trace

        2
  •  0
  •   shizhen    6 年前

    试着改变你的 myLib 换个名字,例如。 myLib_2 ,以避免冲突。

    要使“正确的”类加载器加载本机库,您可以创建一个小类,其中一个静态方法只执行load library。将这个类放在一个额外的jar中,并将这个jar放在共享的Tomcat目录中。然后在web应用程序中,将对System.loadLibrary的调用替换为对新静态方法的调用。这样,OpenCV类及其本机库的类装入器将匹配,并且本机方法可以初始化。

    见: https://stackoverflow.com/a/37213179/8034839

    推荐文章