当前位置: 首页 > 知识库问答 >
问题:

UnsatisfiedLinkError:本机库xxx.so已经加载到另一个类加载程序中

胡曾笑
2023-03-14

我已经部署了一个Web应用程序,其中包含以下代码。

System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);

现在,我部署了另一个也有相同代码的Web应用程序。当它试图加载库时,它抛出以下错误。

Exception in thread "Thread-143" java.lang.UnsatisfiedLinkError: 
Native Library /usr/lib/jni/libopencv_java248.so already loaded in
another classloader

我想同时运行这两个应用程序

    null
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat mat = Highgui.imread("/tmp/abc.png");

我得到了一个例外

java.lang.UnsatisfiedLinkError: org.opencv.highgui.Highgui.imread_1(Ljava/lang/String;)J
    at org.opencv.highgui.Highgui.imread_1(Native Method)
    at org.opencv.highgui.Highgui.imread(Highgui.java:362)

共有1个答案

蒋培
2023-03-14

问题在于OpenCV如何处理本机库的初始化。

通常,使用本机库的类将具有加载库的静态初始值设定项。这样,类和本机库将始终加载在同一个类加载器中。在OpenCV中,应用程序代码加载本机库。

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

public class WebApplicationClass {
    static {
        System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);
    }
}
public class ToolClassInSeparateJarInSharedDirectory {
    public static void loadNativeLibrary() {
        System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);
    }
}

public class WebApplicationClass {
    static {
        ToolClassInSeparateJarInSharedDirectory.loadNativeLibrary();
    }
}
 类似资料:
  • 问题内容: 我已经部署了一个Web应用程序,其中包含以下代码。 现在,我部署了另一个具有相同代码的Web应用程序。尝试加载库时,将引发以下错误。 我想同时运行这两个应用程序。 直到现在我已经尝试了: 在一个应用程序中加载库,并将上述异常捕获到另一个应用程序中 从两个应用程序中删除了jar,并将opencv.jar放入Tomcat的类路径(即/ usr / share / tomcat7 / lib

  • 我有两个java web应用程序,需要使用Windows集成身份验证连接到SQL Server数据库。 加载的第一个可以正常工作,但第二个会引发异常: 当我放置sqljdbc\u auth时,就会出现上述错误。其中一个文件夹中的dll: C:\WINDOWS\system 32\ C:\Program Files\Apache Software Foundation\Tomcat 7.0\bin\

  • 我正在我的web应用程序中集成一个web服务。web服务为我提供了一个。dll和。jar文件。我把.dd放在/jre/bin中,把.jar放在/jre/lib中,然后开发代码并部署应用程序。在开发过程中,我还将。jar文件包含在我的项目构建路径中。在tomcat中运行它时,它给了我一个错误:

  • 如果认为Tomcat的公共类加载器正在加载这个类,实例化它(按照:http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html),然后将引用传递给webapp,从而绕过webapp类加载器,这是不是错的? 是否有一种方法可以告诉Tomcat实例化我的单例(强制公共类加载程序执行),然后提供该实例来满足我的WebApp的依赖性? 任何

  • null 如果有人遇到了这个问题,并知道解决这个问题的任何事情,将不胜感激。

  • 我将dll路径存储在设置文件中。当我输出 如果我在project中添加(dll)作为外部类文件夹,并编写:,它可以在这台机器中工作,但是当我使用可运行的jar时,它找不到,所以我想给出dll的绝对路径。但对我没用。 我也试过: C:\users\argenit\desktop\aaa\dll\ergopointer_64_bit dll\ergopointer_64_bit.dll ergopoi