天天看點

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

在子產品層的講解中,筆者介紹過bundle的唯一辨別是由bundle-symbolicname和bundle-version标記共同構成的。對于生命周期層,我們依然可以采用bundle-symbolicname和bundle-version标記來确定唯一的bundle。不過,基于api使用友善的考慮,在運作期還可以采用其他bundle辨別進行定位,包括:

bundle id(bundle identifier)。bundle id是運作期最常用的辨別符,尤其是在equinox console的指令中。它是由osgi架構自動配置設定的一個長整型數字,在bundle整個生命周期内(包括bundle更新、解除安裝之後)都不會改變,甚至在osgi架構重新開機後都能保留下來。bundle id是在bundle安裝過程中由osgi架構根據bundle安裝時間的先後次序,由小到大進行配置設定的。在代碼中可以通過bundle接口的getbundleid ()方法來擷取目前bundle的id。

bundle位置(bundle location)。bundle位置是osgi容器在bundle安裝過程中配置設定給bundle的定位字元串。這個字元串通常是該bundle的jar檔案位址,但是這并不是強制性的。在一個osgi容器中,每個bundle的定位字元串都必須是唯一的,即使bundle更新時改變了jar檔案的路徑,也不會修改這個定位字元串,是以它可以唯一确定一個bundle。在代碼中我們可以通過bundle接口的getlocation()方法來擷取一個bundle的定位字元串。

bundle符号名稱(bundle symbolic name)。前面介紹過,bundle的符号名稱由開發人員設定,儲存于bundle中繼資料資訊之中。它是靜态的資訊,在bundle打包釋出的那一刻它就被确定下來,不會因使用了不同的osgi架構而有所不同(前面的bundle id和bundle location是由osgi架構所決定的)。bundle的版本與符号名稱一起可以唯一定位一個bundle,在代碼中可以通過bundle接口的getsymbolicname()方法擷取目前bundle的符号名稱,通過getversion()方法擷取bundle的版本号。

我們可以寫一小段簡單的代碼,在equinox架構中運作檢視這3個唯一辨別,示例如下:

輸出結果為:

繼續閱讀