2013-02-21 66 views
1

我有一个DLL提供对Window的LoadLibrary和FreeLibrary的访问(以避免Java无法卸载它)。我需要这个DLL在每个webapp之间保持,因为它不能被加载两次。Tomcat DLL已经加载到另一个类加载器

我已经按照下列步骤操作:

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

,并在$ {} TOMCAT/lib目录与static { System.loadLibrary() }呼叫放在一个单独的类(如一个jar)。当我的Tomcat Web应用程序访问此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 classloader?

有没有办法告诉Tomcat实例化我的单例(迫使普通的类加载器做到这一点),然后提供该实例来满足我的webapp的依赖性?

任何讨论非常赞赏。

+0

如果您尝试在链接提及中创建'$ CATALINA_HOME/shared/lib'并将dll放在那里,您是否也遇到同样的问题?您的类也只有静态初始化器,对不对? – Cratylus 2013-02-21 18:29:31

+0

因此,在那个链接中,他们描述了Tomcat6及以下的共享/ lib。目前,在Tomcat7中,这只是简单地移动到$ CATALINA_HOME/lib。在配置中你可以看到common.loader属性包含了这个。不,该类具有单一访问函数实例()以及定义JNI本机函数。 – 2013-02-26 15:52:38

回答

0

按照此链接卸载DLL:

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

web archive version

我尝试了与Tomcat上运行我的Web应用程序,和它的作品!

简而言之,我从我的自定义类加载器使用反射加载的类中调用System.loadLibrary。这个类然后被垃圾收集器删除。

+1

此链接已死亡。你介意在这里还是在另一个链接上分享你的解决方案? – 2017-04-14 19:04:41

+0

@JomutechByte请参阅https://web.archive.org/web/20150518033642/http://www.codethesis.com/blog/unload-java-jni-dll – EJP 2017-10-11 01:49:26

相关问题