如果你讓那些罐子到OSGi包(即,給他們一個MANIFEST.MF),那麼你可以動態地將它們安裝到OSGi運行時。
如果添加一個包激活你的插件,那麼你可以存儲org.osgi.framework.BundleContext,然後你可以這樣做:
Bundle [] newBundle = new Bundle[] { bundleContext.install(location, newJarInputStream) };
packageAdmin.refreshPackages(newBundle);
packageAdmin.resolveBundles(newBundle);
packageAdmin
是org.osgi.service的一個實例。 packageAdmin.PackageAdmin這是您可以獲得的服務BundleContext#getService
新罐子可以是完整的捆綁包,也可以是以您的插件作爲其主機的捆綁包碎片。如果它們是你的包的片段,那麼你的包(BundleContext#getBundle()
)將需要包含在傳遞給refreshPackages和resolveBundles的數組中。
(編輯類加載) Class.forName
從你的插件代碼只能找到新安裝的包類,如果你的插件有一個將被新的包來滿足一旦被解析的依賴。
- 一種方法可以在插件的清單中選擇
Import-Package
。在這種情況下,您的插件將需要包含在傳遞給refreshPackages
的數組中。
- 另一種選擇是在插件清單中使用
DynamicImport-Package
語句。動態導入可在類加載期間解決
另一個選項是對捆綁對象使用Bundle.loadClass
(而不是Class.forName)用於新安裝的捆綁軟件。這使用了新的bundle的類加載器,所以你的插件本身不需要依賴新的bundle。
這聽起來像是正確的做法(+1) – 2011-01-28 16:13:51