2012-10-16 97 views
1

我正在實現一個包含三個bundle的GUI(swing)應用程序,比如說bundleA,bundleB和bundleC。我使用BundleContext.installBundle(字符串位置)方法將所有這三個包安裝在/使用單獨的安裝程序包中。OSGi軟件包更新不會停止/卸載舊軟件包,爲什麼?

問題開始時我使用名爲「UpgradeBundle」另一束更新三個已安裝包中的一個。更確切地說,我調用BundleC.update(null)方法,然後調用FrameworkWiring.refreshBundles(BundlesForRefresh,null)方法,因爲我讀到該bundle更新需要調用FrameworkWiring.refreshBundles。然而,調用FrameworkWiring.refreshBundles會導致啓動一個帶有更新包的新GUI應用程序(而不是在已經運行的應用程序實例中更新它),而已經運行的應用程序會繼續使用舊捆綁包運行。任何想法爲什麼發生這種情況?

如果你需要對這個問題進行更多的討論,請讓我知道,我會嘗試進一步說明這個問題。

P.S.我正在使用Equinox OSGi框架。

回答

2

刷新將停止引用任何先前版本的更新軟件包的所有軟件包。我猜你的應用程序在調用stop方法時沒有正確關閉現有的實例。啓動方法然後創建一個新的。

爲了阻止應用更新時,你必須仔細地設計系統,以確保有從您的應用程序更新包無類加載器的引用不關閉。服務側重於界面,是實現這一目標的絕佳方式。但是,最終會出現許多情況,您的應用程序需要關閉以刷新其引用。

+0

親愛的@Peter非常感謝您的回覆。是的,我意識到我的應用程序在捆綁生命週期管理方面設計的很糟糕。我會深入研究這一點。 進一步我意識到,我試圖更新的bundleC實際上是一個片段(它有助於bundleA,並沒有自己的激活器)。這使我想到另一個問題:更新包與更新片段之間是否存在顯着差異? – Nadeem