我也來玩OSGI(一)

OSGI 是由 1999 年成立的 OSGI 聯盟提出的一個開放的服務規範,最初的目的是爲嵌入式設備,確切地說是爲可以通過網絡訪問的設備提供一個通用的軟件運行平臺,屏蔽不同設備之間的硬件和操作系統差異,使軟件可以動態地部署和更新。後來 Eclipse 組織注意到了 OSGi 的優點,決定將 Eclipse3.0 及後續版本的插件體系結構基於 OSGi 來實現,並專門成立了一個子項目 Equinox 來實現 OSGi R4 規範,把 Equinox 作爲 Eclipse 的底層運行平臺。Eclipse 組織的這一決定帶來了雙贏的局面,今天的 Eclipse 由於其出色的可擴展的體系結構,已經不再是一個單純的 Java IDE,而是一個開放的開發平臺,一個通用的可擴展的軟件框架,OSGi 也不再侷限於嵌入式領域,而是成爲了一個通用的動態組件開發環境,在桌面,服務器端等領域得到了大量應用。 

    對模塊化的支持是 Java 的一個重要的發展方向,目前 Java 的模塊化標準還存在着JSR 277:Java Module Systems 和 JSR 291:Dynamic Component Support for Java 之爭論,其中JSR291 的主要目的就要將 OSGi 引入到 Java 標準中去,JSR277 則是 SUN 發起的一個Java 模塊化標準。但 OSGi 事實上已經得到了許多國際IT大企業的支持,並且已經有許多商業軟件產品基於 OSGi 來開發,如 IBM 包括 Websphere Application Server(WAS), Rational Software Architecture(RSA) 在內的許多重量級軟件產品均已基於 OSGi 來實現,著名的 IoC 框架 Spring 正在整合 OSGi 技術,現在基於 Eclipse 開發 RCP,插件程序也非常流行,可以預見基於OSGi 的 Java 應用程序將會越來越多,也將會有越來越多的軟件開發組織改變其軟件設計思想和開發方式,擁抱 OSGi 並開始享受 OSGi 帶來的好處

    Eclipse 開發平臺中對基於 OSGi 開發應用程序已經提供了較爲完善的支持,在 Eclipse 集成開發環境中可以輕鬆地完成對一個或多個 bundle 的開發、調試、部署、測試等工作

    OSGi 帶來了規範化的模塊劃分,低耦合的模塊間關係,統一的模塊開發方式,可動態插拔的模塊管理環境。開發 OSGi 應用程序的第一步是在需求分析的基礎上進行精心的模塊劃分,模塊劃分的原則是儘量保持單個模塊的獨立性,使模塊與模塊之間的耦合降到最小,每一個模塊暴露給其它模塊的信息最少,儘量讓模塊之間使用 OSGi 框架提供的服務註冊機制來通信。一般可採用一個模塊一個 Bundle 的方式,併爲每一個 Bundle 在 Eclipse 環境中建立一個 Project 來進行開發,由於模塊與模塊之間的耦合很小,各個 Bundle 之間並不會象傳統的開發方式中的各模塊之間那樣存在糾纏不清的包和類的引用關係,因此大部分Bundle的開發工作可以並行進行而不會互相影響。 

   對於OSGi的成功應用,最有名的應該是Eclipse了,它就是基於OSGi service platform的產品,而且Eclipse組織有一個OSGI R4 的實現,非常不錯,它就是Eclipse的底層核心部分,負責插件的加載和卸載,它的名稱叫 Equinox (月食),名稱挺有趣,一個叫Eclipse(日食),一個叫Equinox (月食),看來想遮住Sun(太陽)的光芒了,也許SUN 公司是受了這個名稱的刺激,所以後來SUN公司的Java開發工具NetBeans進步了不少,不過還是能從這個工具看到Eclipse的影子.

  下面我想通過一個比較簡單的例子來介紹OSGI的開發,因爲我主要專注與C/S這方面,對RCP技術有濃厚的興趣,所以我的例子的開發環境爲 Eclipse 3.3.1 + Equinox 3.3.1 + SWT/JFace 操作系統爲 Windows XP ,電腦是 ThinkPad ,不過這些都影響不大,

  這個例子的需求爲用戶登陸是要求能動態的切換登陸驗證的方式,比如通過DB登錄方式、ConfigFile登錄方式、LDAP登錄方式或其它登錄方式,切換登錄方式要求客戶端不需要重啓,我們來試驗一下,看看效果,在這裏啓動OSGI,出現登錄對話框,輸入用戶名和密碼,然後點擊登錄,根據控制檯的輸出知道這裏是用 LDAP 方式登錄的,然後我們在卸載這個登錄模塊 ,它的Bundle ID 是815 ,在控制檯輸入 stop 815

再在登錄對話框中登錄,這時發現登錄的方式改成了DB登錄方式,我們在 stop 499 ,在點擊登錄,發現登錄方式又變成了ConfigFile 登錄方式,如果我們在 stop 453,這時所有的登錄方式模塊都已經卸載了,控制檯會打印 登錄服務不可用! 的信息

 

,好了,現在開始來新建這樣的項目: 打開Eclipse ,右鍵彈出選擇 "新 建" -> "項目" -->"插件項目" --> 輸入插件項目名稱,比如LoginServices 

這個插件項目的作用是放登陸驗證接口的,我們這裏的登陸驗證接口是

package org.vwpolo.services;

/**

 * @author vwpolo

 *

 */

public interface LoginService {

 /**

     * 判斷是否登陸成功

  * @param userName

  * @param password

  * @return

  */

 public boolean login(String userName, String password);

}

然後在項目的 META-INF/MANIFEST.MF 文件的 Runtime 標籤頁中將這個類所在的包導出:

這樣的話其他的項目就可以通過依賴這個項目使用這個登陸服務接口了,這個項目到着就結束了,這個項目主要是定義模型

   我們再通過上面這種方式新建另一個項目,這個項目就是負責我們登陸的設置,和管理登陸方式的插件項目,項目名稱爲 StartLoginBundle, 在 META-INF/MANIFEST.MF 文件的依賴選項卡中的 Imported Packages 中添加 org.vwpolo.services 包,還有其他的一些依賴包

OK,這樣的話環境就基本搭建起來了。

發佈了31 篇原創文章 · 獲贊 2 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章