2014-03-19 28 views
0

我想實現我自己的自定義ClassLoader。基本上它應該執行默認的OSGi ClassLoader。自定義OSGi ClassLoader

我使用Karaf /菲利克斯,所以在我的情況下,這是org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader

之所以實現我自己的類裝載器:我使用JNI來加載DLL(帶System.load())。但每次我重新部署我的包時,我都會得到一個UnsatisfiedLinkError exception(本地庫xyz.dll已經加載到另一個類加載器中)。

這是因爲DLL已經被JVM加載 - 並且只要加載它的ClassLoader不會被垃圾收集。

所以我希望做這樣的事情:

CustomClassLoader cl = new CustomClassLoader(); 
Class ca = cl.findClass("myPackage.MyClass"); 
Object a = ca.newInstance(); 
Method p = ca.getMethod("myMethod"); 
p.invoke(a); 
p = null; 
ca = null; 
a = null; 
cl = null; 
System.gc(); 

希望以後的CustomClassLoader是垃圾收集 - 和DLL從容器中取出。

我發現奇怪的是:即使如此,每個bundle都有自己的ClassLoader,osgi:uninstall <bundle>不會卸載DLL - 這意味着ClassLoader包仍然存在(而不是垃圾收集)。

+0

此外,我不確定您聲稱正在垃圾收集的類加載器會導致通過類加載器加載的任何共享對象(DLL)從VM進程「卸載」。你有這種行爲的任何文件? –

+0

請參閱以下示例:http://tech-tauk.blogspot.de/2009/11/issues-with-loading-native-libraries-in.html 「本機庫由JVM卸載,當類加載器發現垃圾收集期間,圖書館是從堆中收集的。「 – Frizz

+0

這是一篇博客文章,並非權威。我在想這個問題上Oracle/OpenJDK的文檔。 –

回答

2

您還在Apache Felix用戶列表中提出了此問題。我的回答是利用OSGi提供的本地代碼機制,因爲這可以解決您的問題,而不必惹惱類加載器。 OSGi提供的機制專門解決了使用本地代碼更新捆綁包的情況,因此它應該很好地解決您的問題。