1.
背景信息
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
方面的應用也在不斷的發展中。
IBM Websphere Application Server
從
6.0
版本開始其內核轉向由
OSGi
實現。
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
標準服務實現如下所示:
Equinox
實現項目
|
服務名稱
|
服務說明
|
Application Container
|
該項目實現了
OSGi R4 MEG
中的應用程序容器服務
|
|
Common Utility Bundle
|
由一組
Eclipse
工具類(如
IStatus
,
Assert
,
IAdaptable
等)組成的實用程序
Bundle
。該
Bundle
也可以在非
OSGi
環境中獨立使用。
|
|
Device Access Service
|
OSGi R4
規範中的
Device Access Service
標準服務的實現,該組件由
Prosyst
公司提供實現。
|
|
Declarative Services
|
OSGi R4
規範中的
Declarative Service
標準服務的實現,該組件由
Prosyst
公司提供實現
|
|
Event Admin Service
|
OSGi R4
規範中的事件管理服務的實現。
|
|
HTTP Service
|
OSGi R4
規範中的
HTTP
服務實現
|
|
Log Service
|
OSGi R4
規範中的日誌服務實現
|
|
Metatype Service
|
OSGi R4
規範中的
Metatype
服務的實現
|
|
Preferences Service
|
OSGi R4
規範中的
Preferences
服務的實現
|
|
Extension Registry
|
Equinox
提供的
Ecipse
擴展點(
extension point
)註冊表服務
|
|
Supplemental Bundle/JAR
|
Equinox
提供的一組
Equinox
實現所使用的類型庫
|
|
User Admin Service
|
OSGi R4
規範中的用戶管理服務實現
|
|
Wire Admin Service
|
OSGi R4
規範中的服務通信拓撲管理服務
|
|
OSGi Services API
|
OSGi R4
規範中的服務接口定義,該
Bundle
由
OSGi
聯盟定義的服務
API
接口組成
|
|
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
列表:
Equinox J2EE
實現項目
|
服務名稱
|
服務說明
|
|
HTTP service
|
該
Bundle
是
OSGi R4
規範中的
HTTP
服務的標準實現。目前該實現只支持
Servlet 2.3
。
|
||
HTTP registry
|
該
Bundle
支持使用
Eclipse
的擴展註冊表註冊
servlet
,文件資源和
JSP
而不是使用
OSGi
中的代碼註冊機制。
|
||
Servlet Bridge
|
該
Bundle
提供一個底層的
Hook servlet
,使得
Equinox
可以嵌入到現有的應用服務器中運行。該
Bundle
中的
servlet
啓動嵌入的
Equinox
並使其可以處理來自底層應用服務器接收的
HTTP
請求。
|
||
HTTP Servlet
|
該
Bundle
爲在
Equinox
中發佈其他
servlet
處理引擎(如傳統的應用服務器)爲
OSGi HTTP
服務提供支持
。
|
||
HTTP ServletBridge
|
該
Bundle
爲底層的應用服務器(如
Tomcat
,
Jetty
等)發佈爲
OSGi HTTP
服務提供一層封裝。封裝的應用服務器必須安裝該
servlet bridge
。
|
||
Servlet API
|
Servlet
規範標準接口
API
的
Bundle
封裝。
|
||
Servlet JSP API
|
Servlet JSP API
接口的
Bundle
封裝。
|
||
Jetty
|
嵌入式
Jetty
實現的
Bundle
封裝。目前
Equinox
提供的
Jetty
實現版本爲
5.x
。
|
||
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 作爲其系統內核實現。