2011-02-22 71 views
2

我有一個相當簡單的場景:OSGi或URLClassLoader?

我的應用程序有核心jar文件,其中包含我的應用程序的邏輯。這個核心jar應該在運行時動態監視文件夾,當插件jar被放置在那裏時,它應該加載並準備好使用它。可能有很多插件罐。

什麼是你的經驗最快和最可維護的方式來實現呢?我有兩個建議:

1)一些OSGi容器,Apache Felix文件安裝(觀看dir的新包)。而核心罐被作爲捆綁裝入容器中。

1.1問題是核心jar應該如何檢測到新安裝的bundle是它的插件?是否有辦法監視每個添加的包,並使用我的獨特字符串(如「kalazplugin」)來查找某種設置?換句話說:如何區分我的插件包?

2)只要觀察目錄中的變化以及何時刪除jar,然後使用URLClassLoader動態加載它並自己實現它。我可能需要某種配置文件爲每個插件,這將指定一些設置,例如...

回答

2

如果您使用OSGi,您可以使用擴展模式觀察任何軟件包(稍後已安裝和安裝),並在確定軟件包是您的插件之一時採取任何措施。這個模式很容易實現,特別是在OSGi 4.2中,它已經包含了一個BundleTracker,但是在早期的OSGi版本中只是稍微難一些。

只是谷歌'osgi擴展模式',你會看到很多的參考和實現。

+0

謝謝我要使用Felix的iPOJO Implementatino。但是我認爲使用標準的BundleActivator類可以(理論上)完成幾乎相同的功能,而我所有的「擴展」實現相同的接口。是否有任何折衷(除了更多的代碼)與擴展模式? –

+0

是的,你可以在BundleActivator中做同樣的事情,但是,如果你有200個插件,這將達到200個BundleActivators,對插件註冊過程的任何改變將需要改變和重新部署200個插件包!你得到的照片。 –

+0

擴展模式可能不是最好的選擇,儘管OP並未指定他在安裝後實際上想要對庫進行的操作。想必你想從它加載一個類?最好使用Objects而不是Classes來做到這一點...即使用OSGi Service Registry。只需定義一個接口並允許插件JAR發佈該接口的實例。 –

1

你可以參考'org.eclipse.equinox.p2.directorywatcher'的執行確切的事情你想要什麼。