首页 > 解决方案 > Leadtools.RasterException:本机库 Ltkrnx.dll 已加载到另一个类加载器中

问题描述

我遇到了这个问题:

本机库 Ltkrnx.dll 已在另一个类加载器中加载

在重新部署应用程序(tomcat 8 服务器)期间。

我还添加了检查,但这对我没有帮助。

private void loadLibrary(LTLibrary library) {
    if (!Platform.isLibraryLoaded(library)) {
        Platform.loadLibrary(library);
    }
}

原因:leadtools.RasterException: Native Library C:\LEADTOOLS 20\Bin\CDLL\x64\Ltkrnx.dll 已经加载到另一个类加载器中

标签: javaspring-bootocrleadtools-sdk

解决方案


您是否在 2 个不同的 Web 应用程序中使用 LEADTOOLS?如果是,以下答案可能会帮助您解决问题: java.lang.UnsatisfiedLinkError: Native Library XXX.so already loaded in another classloader

由于该问题是关于 OpenCV,而不是 LEADTOOLS,因此我将在此处引用相关部分(非常轻微的编辑):

现在有一个本地库只能在一个类加载器中加载的限制。Web 应用程序使用它们自己的类加载器,因此如果一个 Web 应用程序加载了本机库,则另一个 Web 应用程序不能这样做。因此,加载本机库的代码不能放在 webapp 目录中,而必须放在容器(Tomcat)的共享目录中。当您有一个使用上述常用模式编写的类时(使用类的静态初始化程序中的 loadLibrary),将包含该类的 jar 放在共享目录中就足够了。但是,在 Web 应用程序代码中调用 loadLibrary 时,本机库仍将加载到“错误的”类加载器中,并且您将收到 UnsatisfiedLinkError。

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

如果您的情况不同,或者那里的建议对您没有帮助,请将以下信息发送至 support@leadtools.com,我们的支持团队将与您一起找出问题:

  1. 这个问题的细节(你得到的例外,LEADTOOLS 20 版,64 位,Tomcat 8)
  2. 您的 LEADTOOLS 产品序列号(请勿在此处发布!)。如果您仍在评估并且没有序列号,请提及。
  3. 到目前为止,您为解决问题所做的尝试以及给您带来的结果(例如,上面提到的答案)。
  4. 有关您的操作系统、IDE 或一般编程环境的其他详细信息。

推荐阅读