.dll已经加载到另一个类加载器中了?

时间:2009-06-23 05:45:00

标签: web-applications java-native-interface javabeans

我在Tomcat 3.2.1下运行了一个需要进行JNI调用的webapp 命令访问旧C ++代码中的数据和方法。加载了一个servlet 上 启动webapp,作为其init方法的一部分,导致数据集 特定于要加载到C ++数据中的webapp实例 结构。

此servlet的Java代码包含以下内容:

static
{
    try {
        System.loadLibrary("JCoreImpl");
        System.out.println("JCoreImpl loaded");
        m_bLibraryLoaded = true;
    } catch (UnsatisfiedLinkError e) {
        m_bLibraryLoaded = false;
        System.out.println("JCoreImpl NOT loaded " + e);
    }
}

如果只有一个webapp,那么事情就可以了(让我们来称呼它 “web应用/ AAA”)。

如果我有第二个webapp(“webapps / bbb”)与webapps / aaa相同 除了C ++数据结构中使用的数据集,然后是webapps / aaa 启动就好了,但是当webapps / bbb启动时出现错误 说明 的是:

JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library
E:\WebStation\binDebug\JCoreImpl.dll already loaded in another classloader

我需要为每个人创建一个单独的本机库实例 webapps,因为每个实例都需要包含对其唯一的数据 特别是webapp。我搜索了邮件档案并阅读 Craig McLanahan的电子邮件解释了类加载器层次结构。但是我 有 无法找到任何特定于加载a的唯一实例的内容 每个webapp的本机库。

4 个答案:

答案 0 :(得分:15)

您无法两次加载相同的本机库。

将该类放在<tomcat>/lib/下的jar文件中,它将在所有战争中共享。

答案 1 :(得分:9)

答案 2 :(得分:0)

在加载之前,将DLL复制到临时目录中的临时文件。完成后删除文件。这样,您可以确保不会加载相同的DLL两次。

答案 3 :(得分:0)

我遇到了这个问题,我解决了这个问题:

<强>问题:

问题是由于您的应用程序服务器的某些配置导致创建多个warear文件,因此它会创建多个已部署的文件。这些部署的文件尝试同时访问加载到静态块中的本机库。

<强>解决方案:

  1. 停止您的Application Server并关闭IDEA
  2. 完成任务管理器
  3. 中的所有java进程
  4. 转到App Server的此地址:jboss-eap-6.4.0\standalone\configuration并打开standalone.xml文件
  5. standalone.xml中,删除所有deployments标记(不要担心,当您重新运行应用程序服务器时,它会插入此标记
  6. 转到App Server的此地址: jboss-eap-6.4.0\standalone\deployments并删除所有部署的 文件和war文件。 (您可以备份战争文件)
  7. 打开IntelliJ Idea并转到:编辑配置JBOSS - &gt;部署选项卡
  8. 删除当前部署并添加一个应该是的新部署 exploded