我也来玩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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章