《深入理解OSGi:Equinox原理、应用与最佳实践》一2.2 Bundle
2.2 Bundle
從本節(jié)開(kāi)始,一直到本書(shū)結(jié)束,我們都會(huì)不斷地提起“Bundle”這個(gè)詞。Bundle是OSGi中最基本的單位,通俗地講,如果說(shuō)OSGi是基于Java平臺(tái)的“模塊化開(kāi)發(fā)體系”,那么Bundle便是其中的“模塊”。
OSGi中的Bundle是在JAR文件格式規(guī)范基礎(chǔ)上擴(kuò)展而來(lái)的,一個(gè)符合OSGi規(guī)范的Bundle首先必須是一個(gè)符合JAR文件格式規(guī)范的JAR包。與JAR文件格式兼容這點(diǎn)雖然沒(méi)有太多技術(shù)含量可言,但是這個(gè)簡(jiǎn)單的舉措極大地加速了OSGi的發(fā)展傳播,它令OSGi的Bundle可以不經(jīng)任何修改就直接應(yīng)用于非OSGi的系統(tǒng)之中,也為將非OSGi的JAR包轉(zhuǎn)換為可在OSGi系統(tǒng)運(yùn)行的Bundle提供了很大的便利。
Bundle相對(duì)普通的JAR文件主要進(jìn)行了以下三個(gè)方面擴(kuò)展。
JAR文件格式規(guī)范里定義的/META-INF/MANIFEST.MF文件用于描述JAR包的元數(shù)據(jù)信息,如JAR包的版本、數(shù)字簽名信息等,Bundle在MANIFEST.MF文件中添加了大量擴(kuò)展定義,如描述該Bundle可以提供哪些資源、依賴(lài)哪些其他Bundle、啟動(dòng)或卸載時(shí)要執(zhí)行哪些動(dòng)作等,這部分內(nèi)容我們會(huì)在2.3節(jié)中詳細(xì)介紹。
加入了一個(gè)可選的/OSGI-OPT文件夾,可以在其中保存一些與Bundle運(yùn)行無(wú)關(guān)的信息,比如Bundle源碼、軟件說(shuō)明書(shū)等。Bundle的使用者可以從中獲取一些額外的信息,也可以安全地刪除該文件夾,以節(jié)約OSGi系統(tǒng)的存儲(chǔ)空間。
Bundle中可以包含一些具備特殊含義的程序和資源,如使用Bundle-Activator定義的初始化類(lèi)、定義在OSGI-INF/l10n目錄中的本地化信息等。
Fragment Bundle是一種特殊的Bundle,它無(wú)法獨(dú)立存在,必須依附于某個(gè)其他的普通Bundle來(lái)使用,可以將它視為“Bundle的插件”、“模塊中的模塊”。
Fragment Bundle經(jīng)常用來(lái)提供某些可選的功能,譬如為某個(gè)實(shí)現(xiàn)具體功能的Bundle提供一個(gè)中文語(yǔ)言包。有這個(gè)語(yǔ)言包,實(shí)現(xiàn)功能的Bundle能顯示中文界面;在沒(méi)有這個(gè)中文語(yǔ)言包時(shí),實(shí)現(xiàn)功能的Bundle也能夠正常使用。Fragment Bundle的另一項(xiàng)主要用途是隔離Bundle中經(jīng)常變動(dòng)的部分,譬如把系統(tǒng)的內(nèi)部配置文件(開(kāi)發(fā)模式還是生產(chǎn)模式、連接的數(shù)據(jù)庫(kù)地址、調(diào)試級(jí)別等)集中在Fragment Bundle中,通過(guò)更換不同的Fragment Bundle來(lái)實(shí)現(xiàn)配置快速切換。
從靜態(tài)角度(開(kāi)發(fā)期)來(lái)看,Fragment Bundle與普通Bundle沒(méi)有太大區(qū)別,它們都以JAR文件格式為基礎(chǔ),具備相同的元數(shù)據(jù)信息標(biāo)記,標(biāo)記的含義與設(shè)置方式也一樣。區(qū)別僅僅是Fragment Bundle的元數(shù)據(jù)中會(huì)使用Fragment-Host標(biāo)記說(shuō)明它的宿主Bundle。
從動(dòng)態(tài)角度(運(yùn)行期)來(lái)看,Fragment Bundle與普通Bundle在運(yùn)行時(shí)的處理差別卻非常大,最重要的一點(diǎn)差異是Fragment Bundle不具備自己獨(dú)立的類(lèi)加載器。OSGi利用每個(gè)Bundle獨(dú)立的類(lèi)加載器互相協(xié)作來(lái)維護(hù)Bundle間導(dǎo)入、導(dǎo)出的依賴(lài)關(guān)系。沒(méi)有類(lèi)加載器,就無(wú)法直接與其他Bundle交互,必須依附于宿主,使用宿主Bundle的類(lèi)加載器完成。關(guān)于這部分內(nèi)容,我們?cè)诤竺鏁?huì)有更詳盡的介紹。
總結(jié)
以上是生活随笔為你收集整理的《深入理解OSGi:Equinox原理、应用与最佳实践》一2.2 Bundle的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: platform总线的probe函数调用
- 下一篇: DNF手游气功师装备怎么选择