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的应用。
Equinox项目包括OSGi R4版本规范核心框架的实现,一系列OSGi标准服务Bundle及运行基于OSGi的系统的一些基础构件。用户可以直接访问该项目在Eclipse的网址Equinox获取概括性的信息。目前,关于Equinox的进展大部分资料及项目进展存在于Eclipse Wiki上。
目前,Equinox项目包括OSGi核心框架的实现,OSGi标准服务Bundle实现,OSGi的服务器端(J2EE实现)应用,Equinox部署更新框架及一些研究方向(未成熟发布的构想如JMX管理,安全管理,面向方面的设计与应用等)。
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文件功能合并。
OSGi在提出核心框架规范的同时为一些常用的服务如日志服务(LogService),配置管理服务(Config Admin),事件管理服务(Event Admin),HTTP服务(HTTP Service)等。Equinox提供了大部分OSGi标准服务的bundle的实现,同时,借助于Eclipse环境的一些自身的特点,Equinox在实现这些OSGi标准服务的同时,提供了很多功能扩展服务(如org.eclipse.equinox.common)。
Equinox项目目前提供的OSGi标准服务实现如下所示:
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
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列表:
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网站相关资料。我会在本系列后续文档中给出详细介绍。
Eclipse提供为插件的分组,更新及远程维护提供了一套完善的机制。用户可以通过远程更新站点安装或升级所需功能的插件。为了适应OSGi环境的特点,Equinox项目组为基于OSGi的系统的部署更新提供了一套全新的框架,称为 “equinox p2”。目前该框架还在第一个发布版本的最后阶段,该功能预计将在Eclipse 3.4版本中集成发布。
Ø 资源管理(Resource Monitoring)
该方向致力于为基于OSGi的系统提供一个轻量级的资源监控管理基础框架,该框架基于JMX技术。目前该研究方向已经提供了一套可供展示的基本实现。
Ø 安全管理
该方向致力于将Java安全机制(JCA/JAAS框架)集成到Eclipse中。为Eclipse/Equinox环境提供诸如消息摘要,数字签名,密钥存储,证书存储等基础安全机制。此外,该方向还为Eclipse提供JAVA包签名,Bundle加载时的签名校验,代码权限等机制的实现。
Ø 面向方面的开发
该方向致力于解决在OSGi环境中面向方面编程的一些技术问题,如加载编排和模块化等。
本文简要概述了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目录下。
SUN公司提出了一个类似于OSGi的模块化系统规范称之为“HK2”。HK2的全称为“Hundred Kilobytes Kernel”,包括Modules Subsytem和Component Model两部分。据称,该内核将在JDK 7中集成,同时,SUN在其开源的GlassFish J2EE应用服务器项目V3版本中将HK2作为其系统内核实现。