天天看點

《深入了解OSGi:Equinox原理、應用與最佳實踐》一2.2 Bundle

從本節開始,一直到本書結束,我們都會不斷地提起“bundle”這個詞。bundle是osgi中最基本的機關,通俗地講,如果說osgi是基于java平台的“子產品化開發體系”,那麼bundle便是其中的“子產品”。

osgi中的bundle是在jar檔案格式規範基礎上擴充而來的,一個符合osgi規範的bundle首先必須是一個符合jar檔案格式規範的jar包。與jar檔案格式相容這點雖然沒有太多技術含量可言,但是這個簡單的舉措極大地加速了osgi的發展傳播,它令osgi的bundle可以不經任何修改就直接應用于非osgi的系統之中,也為将非osgi的jar包轉換為可在osgi系統運作的bundle提供了很大的便利。

bundle相對普通的jar檔案主要進行了以下三個方面擴充。

jar檔案格式規範裡定義的/meta-inf/manifest.mf檔案用于描述jar包的中繼資料資訊,如jar包的版本、數字簽名資訊等,bundle在manifest.mf檔案中添加了大量擴充定義,如描述該bundle可以提供哪些資源、依賴哪些其他bundle、啟動或解除安裝時要執行哪些動作等,這部分内容我們會在2.3節中詳細介紹。

加入了一個可選的/osgi-opt檔案夾,可以在其中儲存一些與bundle運作無關的資訊,比如bundle源碼、軟體說明書等。bundle的使用者可以從中擷取一些額外的資訊,也可以安全地删除該檔案夾,以節約osgi系統的存儲空間。

bundle中可以包含一些具備特殊含義的程式和資源,如使用bundle-activator定義的初始化類、定義在osgi-inf/l10n目錄中的本地化資訊等。

fragment bundle是一種特殊的bundle,它無法獨立存在,必須依附于某個其他的普通bundle來使用,可以将它視為“bundle的插件”、“子產品中的子產品”。

fragment bundle經常用來提供某些可選的功能,譬如為某個實作具體功能的bundle提供一個中文語言包。有這個語言包,實作功能的bundle能顯示中文界面;在沒有這個中文語言包時,實作功能的bundle也能夠正常使用。fragment bundle的另一項主要用途是隔離bundle中經常變動的部分,譬如把系統的内部配置檔案(開發模式還是生産模式、連接配接的資料庫位址、調試級别等)集中在fragment bundle中,通過更換不同的fragment bundle來實作配置快速切換。

從靜态角度(開發期)來看,fragment bundle與普通bundle沒有太大差別,它們都以jar檔案格式為基礎,具備相同的中繼資料資訊标記,标記的含義與設定方式也一樣。差別僅僅是fragment bundle的中繼資料中會使用fragment-host标記說明它的宿主bundle。

從動态角度(運作期)來看,fragment bundle與普通bundle在運作時的處理差别卻非常大,最重要的一點差異是fragment bundle不具備自己獨立的類加載器。osgi利用每個bundle獨立的類加載器互相協作來維護bundle間導入、導出的依賴關系。沒有類加載器,就無法直接與其他bundle互動,必須依附于宿主,使用宿主bundle的類加載器完成。關于這部分内容,我們在後面會有更詳盡的介紹。