.dll文件已加载的类加载器的另一个?.dll文件已加载的类加载器的另一个?(.dll alread

2019-05-13 15:56发布

我已经在使用Tomcat 3.2.1下运行的Web应用程序,需要作出JNI,以访问传统的C ++代码,数据和方法调用。 一个servlet装载在web应用程序,作为其的一部分的启动init方法,使得数据设定特定于该web应用实例被加载到C ++的数据结构。

对于这个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);
    }
}

事情正常工作,如果只有一个Web应用程序(我们称之为“的webapps / AAA”)。

如果我有第二个web应用(“webapps /下BBB”)是相同的web应用,除了在C ++数据结构使用的数据集/ AAA,那么的webapps / AAA启动就好了,但是当的webapps / BBB开始我得到错误,指出:

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

我需要为我的每一个Web应用程序的本机库的一个单独的实例,因为每个实例都需要包含所特有的特定的web应用程序的数据。 我已经通过邮件归档检索和阅读由Craig McLanahan电子邮件,解释类加载器的层次结构。 但我一直没能找到具体到加载本地库的唯一实例为每个web应用什么。

Answer 1:

你不能加载相同的本地库的两倍。

把类在JAR文件中下<tomcat>/lib/ ,它将被共享在所有的战争。



Answer 2:

请参见我在Tomcat下使用JNI时遇到的类加载器的问题上Tomcat的方法文档维基( http://wiki.apache.org/tomcat/HowTo )



Answer 3:

装入前,在临时目录复制的DLL文件的临时文件。 删除文件时,你做。 这种方式可以确保相同的DLL未加载两次。



Answer 4:

我有这个问题,我解决它:

问题:

该问题是由于应用程序服务器的某些配置进行了导致建立一个以上的warear的文件,因此它会创建一个以上的部署文件。 这些部署的文件试图有你的机库的并发访问里面装在一个静态块。

解:

  1. 停止应用程序服务器,并关闭IDEA
  2. 完成所有java从任务管理器进程
  3. 转到你的应用服务器的地址为: jboss-eap-6.4.0\standalone\configuration和开放standalone.xml文件
  4. standalone.xml ,删除所有deployments标签(别担心,当你重新运行应用程序服务器时,它把这个标签
  5. 转到你的应用服务器的地址为: jboss-eap-6.4.0\standalone\deployments和删除所有已部署的文件, war文件。 (你可以备份你的战争文件)
  6. 打开的IntelliJ IDEA和去:编辑配置JBOSS - >部署选项卡
  7. 删除当前的部署,并添加一个新的,应该被exploded


文章来源: .dll already loaded in another classloader?