第一章???????? 解開OSGI的面紗
- OSGI是什么?是Java平臺的一個模塊化層。
- 模塊化:軟件應用程序的代碼被分割為表示獨立內容的邏輯單元,可簡化開發,可通過強化邏輯模塊的界限來提高可維護性。
- Java模塊化的不足
a)???????? Java使用訪問修飾符(如public、protected、private和包級私有),解決底層面向對象封裝,而不是邏輯系統劃分。
比如,如果需要代碼在多個包之間課件,那么包內的代碼必須聲明為public,那么所有的模塊都可以使用這個public類。這樣會暴露具體的實現細節,用戶可能依賴于不想要公開的API,使后續的升級更加困難。
b)???????? 易錯的類路徑概念、
原因是類路徑隱藏了代碼版本、依賴和一致性等特性。類路徑不關系代碼版本,無法明確描述依賴關系。建立類路徑的過程是煩瑣易錯的,你只是不停地添加類庫,知道虛擬機不再報找不到類的錯誤。經常出現一個JAR文件的類與另一個JAR文件中不兼容的類交互時會出現NoSuchMethodError異常。
c)???????? 部署和管理支持上的不足。
在Java中存在對多個版本的依賴時,沒有簡單的方法來正確部署這些代碼并執行。在部署之后更新應用和組件也會面臨同樣問題。
- OSGI的幫助
a)???????? 當啟動程序時,先確保代碼滿足依賴關系,然后才允許執行代碼。不會出現由于類路徑不正確導致ClassNotFoundException或NoSuchMethodError。
b)???????? 要求在版本和其他約束條件方面上對依賴集進行一致性檢查,不會出現由于依賴庫的錯誤版本導致程序執行時錯誤。
c)???????? 不必擔心由于層次化的類加載模式隱含的限制,導致沒款見共享類時導致類型不一致,如foo instanceof Foo == false。
d)??????? 將一個程序打包成邏輯上獨立的JAR文件,并且只部署哪些某個安裝需要的部分。這大致闡述了OSGi的目的。
e)???????? OSGi為JAR文件定義了新一級的代碼可見性。將一個程序打包成邏輯上獨立的JAR文件,聲明哪些代碼是可以被其他JAR文件訪問。
f)????????? 為程序定義一個插件式的擴展機制。OSGi模塊化特別適合提供強大的擴展性機制,包括支持執行時的動態性。
- 架構概覽
OSGi服務平臺包括OSGi框架和OSGi標準服務。
l? OSGI框架是實現并提供OSGi功能的運行環境。
l? OSGi標準服務定義了很多用于執行常見任務(如日志和首選項)的可重用API。
- OSGi框架
a)???????? 框架的實現方式:Apache Felix, Eclipse Equinox,KnopFlerfish。Eqinox OSGi框架實現是Eclipse IDE的底層運行時環境。Apache Felix OSGi框架實現是GlassFish v3的運行環境。多種應用長江表明OSGi框架具有很高的價值和靈活性。
b)???????? OSGi框架的分層結構:
???????????????????????? i.????????????? 模塊層,關注于打包和共享代碼。
?????????????????????? ii.????????????? 生命周期層,關注于提供執行時環境模塊管理和對底層OSGi框架的訪問。
????????????????????? iii.????????????? 服務層,關注于模塊,特別是模塊內的組件間的交互和通信。
- 模塊層
l? 定義了OSGI模塊的概念,并稱為bundle。
l? Bundle是一個包含元數據、類文件和相關資源的JAR文件。
l? Bundle可以是一個普通的JAR文件+特殊的元數據,也可以是包含構成一個特定應用程序的多個邏輯模塊組成的JAR。
l? Bundle比標準的JAR文件更強大,因為可以明確聲明名導出包。從這個意義上說,Bundle擴展了Java的普通訪問修飾符(public,private,protected)。
l? Bundle可以明確聲明依賴哪些外部包(導入)。
l? 明確聲明導入包和導出包的好處是:OSGI框架可以自動地管理和驗證它們的一致性,稱為bundle解析,使導入包和導出包相匹配,確保bundle版本和其他方面約束的一致性。
- 生命周期層
l? 定義了在OSGI框架中是如何動態安裝和管理Bundle的。
l? 目的一:在應用程序外部,精確定義啦bundle生命周期的操作(安裝、更新、啟動、停止和卸載)。
l? 目的二:定義了bundle如何訪問它們的執行環境。如何訪問它們的執行環境。執行環境為bundle提供了一種與OSGi框架交互的方式和執行時的一些便利。
l? 生命周期層整體支持創建可從外部(和遠程)管理的而應用程序,或者完全自我管理的應用程序,或者兩者的任意組合。
- 服務層
l? 使用基于接口的面向服務的交互模式。
l? 主要涉及面向服務的發布、查找和綁定。服務提供者將服務發布到服務注冊中心;服務客戶端通過搜索服務注冊中心,查找可供使用的服務。
l? 基于接口,提倡接口與實現之間的分離。OSGI服務是Java接口,表示服務提供者和服務客戶端之間的一種契約。服務層通過基于服務的動態性(服務可以在任何時刻出現或消失)來擴展聲明周期層基于bundle的動態性。結果產生了一種支持模塊化和靈活性的編程模式。
- 如何使用OSGi框架中的層?
a)???????? 涉及應用,將它分解為一些服務接口(普通的基于接口和編程)和這些接口的客戶端。
b)???????? 使用你選定的工具和方法來實現服務提供者和客戶端組件。
c)???????? 將服務提供者和客戶端組件打包成獨立的JAR文件,然后用合適的OSGi元數據擴展每個JAR文件。
d)???????? 啟動OSGi框架
e)???????? 安裝和啟動所有來自步驟c的JAR文件。