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.1OSGi核心框架的实现
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.2OSGi标准服务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.3OSGi的服务器端(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
服务提供一层封装。封装的应用服务器必须安装该
servletbridge
。
| ||
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.4Equinox部署更新框架(Provisioning)
Eclipse
提供为插件的分组,更新及远程维护提供了一套完善的机制。用户可以通过远程更新站点安装或升级所需功能的插件。为了适应
OSGi
环境的特点,
Equinox
项目组为基于
OSGi
的系统的部署更新提供了一套全新的框架,称为
“
equinox p2
”。目前该框架还在第一个发布版本的最后阶段,该功能预计将在
Eclipse 3.4
版本中集成发布。
2.5Equinox的最新研究方向
Ø
资源管理(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
作为其系统内核实现。