2009-09-11 58 views
5

我正在開發一個OSGi捆綁軟件,它將服務實現爲本地可執行文件的包裝。也就是說,該服務使用ProcessBuilder運行可執行文件,爲其提供一些數據並檢索結果。我的問題是關於打包這個包的最佳方式。本機可執行文件包含大量相關數據文件,這些文件都必須存在於磁盤上供工具運行。我發現在OSGi中處理原生DLL的引用很多,但沒有一個解決與必須存在於磁盤上的捆綁軟件相關聯的文件,而不是僅通過類路徑可檢索的文件。包含OSGi捆綁包的其他資源

我在想,我可以直接在捆綁包中包含exectuable和依賴文件,然後在啓動捆綁包時以編程方式提取到某個目錄。我能想到的另一個選擇是將可執行文件放在某處並設置指向它的系統屬性,但我希望將配置保持在最低限度。

不是特定於特定OSGi實現的解決方案會很好,但如果不是,我使用Equinox。

謝謝!

回答

2

當然你的解決方案是有效的。但是,您必須小心,也可以停止並刪除在安裝過程中提取並啓動的任何資源。如果可執行文件也創建了任何類型的工作文件,這可能特別難以跟蹤。

您應該這樣做是因爲OSGi的優勢之一就是生命週期管理,它允許您也可以不帶痕跡地刪除捆綁包和服務。爲此,該框架可以追蹤包裹所做的一切。如果在卸下已安裝並啓動它的軟件包後保持可執行的運行狀態,則連接會丟失,並且可能會一直運行,直到重新啓動計算機(通常不是嵌入式系統的選項)。

4

這些附加文件是否需要由本機代碼寫入?如果沒有,沒有什麼能阻止你將任何你喜歡的文件放在一個包中。

OSGi中的常見問題是找出文件的路徑,因爲OSGi並不假定文件系統可用(並不像OSGi在嵌入式設備中啓動時那樣奇怪)。

如何控制本機代碼查找其相關文件的位置?你需要通過一條路嗎?

如果你想有一個目錄複製或解包的東西,然後使用:

org.eclipse.core.runtime.Platform.getStateLocation() 

,讓你的包工作目錄。

如果你想找到你的包特定的文件的路徑,你可以這樣做:

org.eclipse.core.runtime.FileLocator.toFileURL((context.getBundle().getEntry("/etc/readme.txt"))) 

,在這種情況下,將在當前的包返回文件的URL到/etc/readme.txt

這兩段代碼都假定它們在激活方的start()方法中。

+0

OSGi服務平臺核心規範版本4版本4.3提供了['BundleContext.getDataFile(String)'](https://osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html#getDataFile% 28java.lang.String%29),這可能是合適的。 – 2016-04-20 20:47:43