2011-08-17 81 views
10

我想要做的是爲我的代碼創建一個「啓動器」框架,給定一個URL和預定義的版本方案: 1)去檢查是否存在更新 2)下載更新 3)「安裝」更新 4)「重新運行」應用程序使用OSGi實現自動更新

我想a)做現有的JVM的所有內部和b)是平臺獨立的。高高的順序?基於我對OSGi和Apache Felix的(有限的)瞭解,我確信這是可能的,但我真的迷失在細節中。

檢查更新並下載它是微不足道的。導致「舊」包卸載和「新」包加載是我卡住的地方。過去我已經完成了OSGi的工作,但是它的動態性比這更低。我們將非常感謝一個好的出發地或正確的方向。

如果我認真地過度烘烤已經用免費庫解決的問題,請告訴我這一點,但到目前爲止我還沒有發現任何東西。 :-)

回答

6

您甚至不需要下載它,只需檢查是否有更新可用,然後在需要更新的軟件包上調用Bundle.update(InputStream),然後再調用PackageAdmin。 refreshPackages()之後。

+0

這將導致以前的捆綁包解除正確?更新後現有捆綁軟件會發生什麼情況(即在硬盤上)? – user453385

+0

Richard的答案簡潔而正確,請參閱http://www.osgi.org/javadoc/r4v43/org/osgi/framework/Bundle.html#update%28java.io.InputStream%29 - (舊)包的狀態將會將其更改爲UNINSTALLED,在這種情況下,它不再可用。不知道每個框架都做了什麼 - 它們肯定會在重新啓動之間持有捆綁包,我想可以完全刪除一個卸載的捆綁包(只要垃圾收集不受阻礙,以及磁盤緩存都從JVM中移除)。 OSGi非常適合您的需求,如果靈活性可以通過maven repo和pax mvn url處理程序完成 – earcam

+0

刷新會導致舊捆綁「解除綁定」併成爲垃圾收集。更新後直接在硬盤驅動器和內存中對軟件包進行兩次修訂,假定其他軟件包依賴於更新後的軟件包。這就是爲什麼刷新是必要的,因爲您希望將任何從屬軟件包切換到新版本。一旦刷新發生,那麼在內存或磁盤上只有一個修訂版本的更新包。 –