Equinox項目是Eclipse開源組織提供的OSGi框架的實現。Eclipse自3.0版本開始,其內核移植到OSGi框架上。通過OSGi框架強大的組件控制,交互和管理能力,再加上Eclipse插件的自有特點,Eclipse開源框架得到了跳躍式的發展。同時,OSGi規范得益於Eclipse IDE環境龐大的使用者,OSGi聯盟也進入了快速發展時期。
OSGi框架在2006年之前還不為廣大的開發者所知,OSGi的開源框架實現也只有ObjectWeb上的Oscar和Knopflerfish兩個實現。最初的OSGi標准主要應用於J2ME和J2SE,Equinox的加入使得OSGi標准的應用領域不斷擴充,目前OSGi在J2EE方面的應用也在不斷的發展中。
OSGi的本質是將Java面向對象的開發轉向面向組件和服務的開發。OSGi框架提供了一套完善的機制用於管理和控制組件(Bundle)、服務(Service)的生命周期,以及組件和服務在其生命周期內的交互。
本文及後續系列文章將以Equinox項目為基礎,講述如何實現基於OSGi的應用。
2. Equinox項目概述
Equinox項目包括OSGi R4版本規范核心框架的實現,一系列OSGi標准服務Bundle及運行基於OSGi的系統的一些基礎構件。用戶可以直接訪問該項目在Eclipse的網址Equinox獲取概括性的信息。目前,關於Equinox的進展大部分資料及項目進展存在於Eclipse Wiki上。
目前,Equinox項目包括OSGi核心框架的實現,OSGi標准服務Bundle實現,OSGi的服務器端(J2EE實現)應用,Equinox部署更新框架及一些研究方向(未成熟發布的構想如JMX管理,安全管理,面向方面的設計與應用等)。
2.1 OSGi核心框架的實現
Equinox的OSGi核心實現由三部分組成,包括:
OSGi核心規范的實現(org.eclipse.osgi)
該項目是OSGi核心框架標准規范的實現。由於Eclipse在3.0版本之前未采用OSGi作為系統內核,所以,為了重用Eclipse3.0以前核心系統的代碼,Equinox的OSGi實現在一定程度上顯得比較繁冗。用戶如果想研究開源的OSGi框架實現的源代碼,可以從Oscar(目前為Apache的Felix項目)或Knopflerfish項目著手。ObjectWeb上的Oscar項目最初實現OSGi R2版本框架時,整個核心的源代碼不超過40個類文件。現在,Oscar項目轉由apache維護,項目稱之為Felix,目前已發布1.0版本。Knopflerfish也是很早實現OSGi的一個開源項目,該項目的網站上提供了很多關於OSGi編程的注意事項。
OSGi框架啟動支持(org.eclipse.equinox.launcher)
OSGi 框架啟動支持對於Eclipse IDE開發環境熟悉的開發用戶來說並不算陌生。使用Eclipse以前版本的用戶會發現在Eclipse安裝目錄下有一個startup.jar的文件,該文件是Eclipse開發環境的入口程序封裝。Equinox將該Jar文件的實現遷移為一個獨立的OSGi Fragment。該Fragment主要是幫助Equinox建立起運行環境,如類加載路徑,運行配置參數等等。
Equinox啟動可執行程序
Equinox啟動可執行程序即為eclipse.exe文件,該執行程序並不是Eclipse以前版本的exe可執行文件,而是由原來的eclipse.exe程序拆分而來,該執行文件的一部分功能拆分為一個共享DLL,放置在OSGi框架啟動支持段項目(org.eclipse.equinox.launcher)中,與原來的Eclipse根目錄下的startup.jar文件功能合並。
2.2 OSGi標准服務Bundle實現
OSGi在提出核心框架規范的同時為一些常用的服務如日志服務(LogService),配置管理服務(Config Admin),事件管理服務(Event Admin),HTTP服務(HTTP Service)等。Equinox提供了大部分OSGi標准服務的bundle的實現,同時,借助於Eclipse環境的一些自身的特點,Equinox在實現這些OSGi標准服務的同時,提供了很多功能擴展服務(如org.eclipse.equinox.common)。
Equinox項目目前提供的OSGi標准服務實現如下所示:
org.eclipse.equinox.app
Application Container
該項目實現了OSGi R4 MEG中的應用程序容器服務
org.eclipse.equinox.common
Common Utility Bundle
由一組Eclipse工具類(如IStatus,Assert,IAdaptable等)組成的實用程序Bundle。該Bundle也可以在非OSGi環境中獨立使用。
org.eclipse.equinox.device
Device Access Service
OSGi R4規范中的Device Access Service標准服務的實現,該組件由Prosyst公司提供實現。
org.eclipse.equinox.ds
Declarative Services
OSGi R4規范中的Declarative Service標准服務的實現,該組件由Prosyst公司提供實現
org.eclipse.equinox.event
Event Admin Service
OSGi R4規范中的事件管理服務的實現。
org.eclipse.equinox.http
HTTP Service
OSGi R4規范中的HTTP服務實現
org.eclipse.equinox.log
Log Service
OSGi R4規范中的日志服務實現
org.eclipse.equinox.metatype
Metatype Service
OSGi R4規范中的Metatype服務的實現
org.eclipse.equinox.preferences
Preferences Service
OSGi R4規范中的Preferences服務的實現
org.eclipse.equinox.registry
Extension Registry
Equinox提供的Ecipse擴展點(extension point)注冊表服務
org.eclipse.equinox.supplement
Supplemental Bundle/JAR
Equinox提供的一組Equinox實現所使用的類型庫
org.eclipse.equinox.useradmin
User Admin Service
OSGi R4規范中的用戶管理服務實現
org.eclipse.equinox.wireadmin
Wire Admin Service
OSGi R4規范中的服務通信拓撲管理服務
org.eclipse.osgi.services
OSGi Services API
OSGi R4規范中的服務接口定義,該Bundle由OSGi聯盟定義的服務API接口組成
org.eclipse.osgi.util
OSGi UtilitIEs
OSGi R4規范中的工具類接口及接口實現Bundle
2.3 OSGi的服務器端(J2EE實現)應用
Equinox實現了OSGi在J2ME、J2SE方面的應用的同時,也推動了OSGi在J2EE方面的應用。Equinox提供了一組基礎的Bundle,使得使用JSP、Servlet和Struts等J2EE技術的Web應用項目可以運行於Equinox OSGi環境中。同樣的,Equinox通過一組Bundle,可以將Equinox OSGi應用嵌入到現有的Web服務器(如Tomcat,Jetty等)和應用服務器(如Websphere,Weblogic等)中。
下面是Equinox在J2EE應用方面的一組Bundle列表:
org.eclipse.equinox.http
HTTP service
該Bundle是OSGi R4規范中的HTTP服務的標准實現。目前該實現只支持Servlet 2.3。
org.eclipse.equinox.http.registry
HTTP registry
該Bundle支持使用Eclipse的擴展注冊表注冊servlet,文件資源和JSP而不是使用OSGi中的代碼注冊機制。
org.eclipse.equinox.servletbridge
Servlet Bridge
該Bundle提供一個底層的Hook servlet,使得Equinox可以嵌入到現有的應用服務器中運行。該Bundle中的servlet啟動嵌入的Equinox並使其可以處理來自底層應用服務器接收的HTTP請求。
org.eclipse.equinox.http.servlet
HTTP Servlet
該Bundle為在Equinox中發布其他servlet處理引擎(如傳統的應用服務器)為OSGi HTTP服務提供支持 。
org.eclipse.equinox.http.servletbridge
HTTP ServletBridge
該Bundle為底層的應用服務器(如Tomcat,Jetty等)發布為OSGi HTTP服務提供一層封裝。封裝的應用服務器必須安裝該servlet bridge。
Javax.servlet
Servlet API
Servlet規范標准接口API的Bundle封裝。
Javax.servlet.JSP
Servlet JSP API
Servlet JSP API接口的Bundle封裝。
org.mortbay.jetty
Jetty
嵌入式Jetty實現的Bundle封裝。目前Equinox提供的Jetty實現版本為5.x。
org.eclipse.equinox.http.jetty
HTTP Jetty
該Bundle封裝Jetty為標准的OSGI HTTP服務。目前該服務只能使用Jetty 5.x版本;如果用戶希望使用Jetty 6.x版本的Bundle封裝,可以參考ops4j上的實現。
關於如何在Equinox環境中部署Web應用(JSP、Servlet和Struts等),請參考Equinox網站相關資料。我會在本系列後續文檔中給出詳細介紹。
2.4 Equinox部署更新框架(Provisioning)
Eclipse提供為插件的分組,更新及遠程維護提供了一套完善的機制。用戶可以通過遠程更新站點安裝或升級所需功能的插件。為了適應OSGi環境的特點,Equinox項目組為基於OSGi的系統的部署更新提供了一套全新的框架,稱為 “equinox p2”。目前該框架還在第一個發布版本的最後階段,該功能預計將在Eclipse 3.4版本中集成發布。
2.5 Equinox的最新研究方向
資源管理(Resource Monitoring)
該方向致力於為基於OSGi的系統提供一個輕量級的資源監控管理基礎框架,該框架基於JMX技術。目前該研究方向已經提供了一套可供展示的基本實現。
安全管理
該方向致力於將Java安全機制(JCA/JAAS框架)集成到Eclipse中。為Eclipse/Equinox環境提供諸如消息摘要,數字簽名,密鑰存儲,證書存儲等基礎安全機制。此外,該方向還為Eclipse提供Java包簽名,Bundle加載時的簽名校驗,代碼權限等機制的實現。
面向方面的開發
該方向致力於解決在OSGi環境中面向方面編程的一些技術問題,如加載編排和模塊化等。
3. 結論與參考
本文簡要概述了Equinox在OSGi規范方面的實現以及它為OSGi在其他領域的應用所做的研究。後續文檔中,我們將會將上述各個方面展開進行詳細的描述。OSGi的廣泛應用將大大推動Java由面向對象的編程向面向組件和服務的編程轉變。
目前,JCP組織提出JSR-291將OSGi納入JAVA標准規范。如果該JSR最終被集成到J2SE實現中,開發人員可以在Java基礎編程中直接采用OSGi提供動態的模塊化應用。
Equinox項目源代碼的位置位於CVS服務器上::pserver:anonymous:dev.eclipse.org/cvsroot/eclipse路徑下,以org.eclipse.equinox.*命名的項目以及該位置下的equinox-incubator目錄下。
4. 附注
SUN公司提出了一個類似於OSGi的模塊化系統規范稱之為“HK2”。HK2的全稱為“Hundred Kilobytes Kernel”,包括Modules Subsytem和Component Model兩部分。據稱,該內核將在JDK 7中集成,同時,SUN在其開源的GlassFish J2EE應用服務器項目V3版本中將HK2作為其系統內核實現。