2013-02-21 68 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

相關問題