我有一个 DLL,它提供对 Window 的 LoadLibrary 和 FreeLibrary 的访问(以解决 Java 无法卸载它的问题)。我需要这个 DLL 在每个 Web 应用程序之间保留,因为它不能加载两次。
我已按照以下步骤操作:
并使用 static { System.loadLibrary() }
调用在 ${TOMCAT}/lib 下放置一个单例类(作为 jar)。当我的Tomcat webapp访问这个Singleton时,它仍然抛出错误
UnsatisfiedLinkError: native 库 ${TOMCAT}\lib\Native.dll 已在另一个类加载器中加载
认为 Tomcat 的通用类加载器正在加载此类、实例化它(按照: http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html )然后将引用传递给 web 应用程序从而绕过 web 应用程序类加载器,这是错误的吗?
有没有办法告诉 Tomcat 实例化我的单例(强制公共(public)类加载器执行此操作),然后提供该实例来满足我的 Web 应用程序的依赖关系?
非常感谢任何讨论。
最佳答案
点击此链接卸载 dll:
http://www.codethesis.com/blog/unload-java-jni-dll
我在 Tomcat 上运行的 Web 应用程序上进行了尝试,它有效!
简单地说,我从由我的自定义类加载器使用反射加载的类中调用 System.loadLibrary。然后这个类会被垃圾收集器删除。
关于java - Tomcat DLL 已加载到另一个类加载器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15009201/