Tomcat DLL已经加载到另一个类加载器中

时间:2013-02-21 18:02:27

标签: java java-native-interface tomcat7

我有一个DLL,可以访问Window的LoadLibrary和FreeLibrary(以解决Java无法卸载它的问题)。我需要这个DLL在每个webapp之间保持,因为它无法加载两次。

我已按照以下步骤操作:

http://wiki.apache.org/tomcat/HowTo#I.27m_encountering_classloader_problems_when_using_JNI_under_Tomcat

并在$ {TOMCAT} / lib下调用static { System.loadLibrary() }调用单个类(作为jar)。当我的Tomcat webapp访问此Singleton时,它仍然会抛出错误

UnsatisfiedLinkError: Native Library ${TOMCAT}\lib\Native.dll already loaded in another classloader

认为Tomcat的通用类加载器正在加载此类,实例化它(根据:http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html)然后将引用传递给webapp从而绕过webapp类加载器,这是错误的吗?

有没有办法告诉Tomcat实例化我的单例(强制公共类加载器执行它)然后提供该实例以满足我的webapp的依赖?

任何讨论都非常感激。

1 个答案:

答案 0 :(得分:0)

点击此链接卸载dll:

http://www.codethesis.com/blog/unload-java-jni-dll

web archive version

我尝试使用在Tomcat上运行的Web应用程序,它可以工作!

简单地说,我从使用反射的自定义类加载器加载的类中调用System.loadLibrary。然后垃圾收集器删除该类。