我在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的本机库。
答案 0 :(得分:15)
您无法两次加载相同的本机库。
将该类放在<tomcat>/lib/
下的jar文件中,它将在所有战争中共享。
答案 1 :(得分:9)
请参阅Tomcat HowTo wiki上的I'm encountering classloader problems when using JNI under Tomcat部分(http://wiki.apache.org/tomcat/HowTo)
答案 2 :(得分:0)
在加载之前,将DLL复制到临时目录中的临时文件。完成后删除文件。这样,您可以确保不会加载相同的DLL两次。
答案 3 :(得分:0)
我遇到了这个问题,我解决了这个问题:
<强>问题:强>
问题是由于您的应用程序服务器的某些配置导致创建多个war
或ear
文件,因此它会创建多个已部署的文件。这些部署的文件尝试同时访问加载到静态块中的本机库。
<强>解决方案:强>
java
进程
jboss-eap-6.4.0\standalone\configuration
并打开standalone.xml
文件standalone.xml
中,删除所有deployments
标记(不要担心,当您重新运行应用程序服务器时,它会插入此标记jboss-eap-6.4.0\standalone\deployments
并删除所有部署的
文件和war
文件。 (您可以备份战争文件)exploded