2010-06-22 74 views
7

我們正在擴展我們的java應用程序以支持插件。其中一部分內容包括將插件與我們自己的類隔離開來,因此每個插件都將存在於它自己的類加載器中。實現過濾類加載器

我們也計劃給插件一個java框架來處理,因此它必須暴露給插件。這個java框架還包含需要從我們自己的java代碼訪問的類,因此它也必須可以被我們自己的java代碼訪問。

問題是,如果Java框架存在於系統類加載器(我們自己的java代碼所在的地方)中,那麼我們無法爲插件提供我們想要的隔離。如果我們選擇將java框架分離到不同的類加載器並將其用作插件類加載器的父類,那麼java框架對我們自己的類將不可見。

我想到的當前解決方案是實現一個過濾類加載器。 java框架將存在於系統類加載器中,但是此類加載器將過濾來自系統類加載器的所有內容,除了java框架,我將使用此類加載器作爲插件的父類加載器。

這裏有一個粗略的實現它:

public class FilteringClassLoader extends ClassLoader { 
    private URLClassLoader _internalLoader; 

    public FilteringClassLoader(ClassLoader parent) { 
     super(parent); 

     // load our java framework to this class loader 
     _internalLoader = new URLClassLoader(...) 
    } 

    public Class<?> loadClass(String name) throws ClassNotFoundException { 
     // first, try to load from our internal class loader 
     // that only sees the java framework if that works, load the class 
     // from the system class loader and return that. otherwise, the class 
     // should be filtered out and the call to loadClass will throw as expected 
     _internalLoader.loadClass(name); 

     Class<?> retClazz = super.loadClass(name); 

     return retClazz; 
    } 
} 

然而,這有幾個問題我看到它的方式:

  1. 使用單獨的URLClassLoader只看到是否應該過濾類感覺一個黑客給我。
  2. 當一個插件加載一個類時,該類的父類加載器將成爲系統類加載器,這明顯破壞了我試圖實現的全部目的。

您如何解決這類問題?

+0

這與在JRE庫中引入'com.sun'包的依賴關係的人有什麼不同嗎?還是有進一步的限制? – McDowell 2010-06-22 11:10:19

+0

不知道你的意思 – 2010-06-22 13:14:23

回答

2

你如何解決這類問題?

OSGi聯盟已經做到了。維基百科關於OSGi framework的文章可能會給你一些想法。

您可能想看看Eclipse的源代碼,看看它們是如何實現插件加載的。

+0

你碰巧有任何其他好的介紹文章給OSGi嗎?維基百科條目似乎相當密集。 – 2010-06-22 11:41:18

+0

你可以試試這個:http://aneeshkumarkb.blogspot.com/我不是OSGi專家,但是我編寫了Eclipse插件。 – 2010-06-22 11:44:14

+0

這是一個非常寶貴的資源,我甚至沒有聽說過這個項目(Java新手談話)。對我來說,對我們的小插件框架來說有點矯枉過正,但它肯定會在將來證明有用。 – 2010-06-22 13:21:44

2

如果我們選擇將java框架分離到不同的類加載器並將其用作插件類加載器的父類,那麼java框架對我們自己的類將不可見。

將您的代碼放入一個類加載器中,該加載器是插件類加載器的一個對象,它們都以接口代碼類加載器作爲父類。

+0

這是一個很好的解決方案,只要API代碼可以完全與核心應用程序代碼的任何依賴關係隔離即可。 – 2010-06-22 11:53:27

+0

我也想過這樣做,坦率地說,我可能會選擇這個解決方案。問題是:(1)'matt b'說了什麼,雖然現在框架界面是完全隔離的。 (2)我們有一些核心代碼,出於某種原因直接嘗試和訪問系統類加載器,如果我從那裏移動所有類,它可能會破壞很多現有的代碼。雖然可能是修復該代碼的時候了。 – 2010-06-22 13:20:06