OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox

 由  ValRay 发布

前言

Java 7 的发布日期临近,模块化是 Java 7 中重要的特性之一。在 Java 语言级对模块化提供支持之前,OSGi 已经是业界中知名的 Java 模块化规范。OSGi 联盟成立于 1999 年,发展到今天已经得到了众多企业、厂商、开源组织的支持,尤其当主流的 Java 应用服务器(Oracle 的 Weblogic、IBM 的 Websphere 及 Sun 的 Glassfish 等)都采用 OSGi 时,OSGi 作为 Java 模块化标准已成为事实。掌握 OSGi 是实现模块化 Java 应用的必备技能,在将来甚至会成为 Java 语言中必须学习的技能之一,就像现在 Java 中的泛型一样,而动态化也是 OSGi 的另一特性。OSGi 对于动态化的支持能够帮助开发者更好地实现“即插即用”、热部署及“即删即无”的系统。

《OSGi 原理与最佳实践》作为一本早于同类技术英文书而编写的 OSGi 中文书籍,旨在为希望实现模块化、动态化 Java 系统的架构师和开发工程师提供 OSGi 入门知识,同时也为希望深入掌握 OSGi 的架构师、开发工程师提供 OSGi 知识的深入讲解。原书内容从 OSGi 的简介开始,到 OSGi 框架的使用,再到 OSGi 规范的掌握,后到 OSGi 框架的实现分析,阐述了基于 OSGi 编写模块化、动态化的 Java 系统须要掌握的知识体系,希望此书能给读者带来一次愉快的 OSGi 之旅。

本迷你书作为《OSGi 原理与佳实践(精选版)》,节选了原书中的第二、三章,结合简单例子 及经典的 PetStore 对 OSGi 框架的使用进行了介绍。

本迷你书中所包含的实例,由于篇幅关系,书中仅列出了代码的片断,如需完整代码,请到 http://china.osgiusers.org 中下载。

第 1 章 OSGi框架简介

前面我们对 OSGi 及其现状做了一个大体的介绍。下面一起来看我们常用的 OSGi 框架,也会 结合具体的实例让大家来使用这些框架。

1.1 Equinox

1.1.1 简介

首先来看 Equinox。Equinox 是 Eclipse 中的项目,并作为 OSGi R4 RI 而知名,由于 Equinox 有 Eclipse IDE 这个成功案例,反映出了 Equinox 作为 OSGI 框架的优势。Equinox 目前是随着 Eclipse 版本而发布的,同时,它也提供独立的下载,在独立的下载页面中可以下载到 Equinox 对于 OSGi R4 的所有实现,以及 Equinox 扩展 OSGi R4 而提供的 Bundle。

Equinox 开发小组由 IBM 的 Jeff 领衔,开发状态非常活跃,从其开发者 maillist 可以看出,讨论非常热闹,大家感兴趣的话可以申请加入开发者 maillist:

http://dev.eclipse.org/mailman/listinfo/equinox-dev。

想了解更多的 Equinox 信息请参看:

官方站 http://www.eclipse.org/equinox 中文站

http://china.osgiusers.org

下面介绍如何搭建开发环境。

1.1.2 环境搭建

既然是基于 Equinox 开发,我们首先要下载 Equinox。Equinox 是 Eclipse 的工程, Eclipse 3.1 之后的版本都是通过它来启动的,如果使用的是 Eclipse 3.1 之后的版本,Eclipse 本身就已经包含了 Equinox,可在 Eclipse 的 plugins 目录下看到类似 org.eclipse.osgi3.4.3.R34xv20081215- 1030.jar 这样的文件(不同版本的 Eclipse 下对应的版本号和日期会有所不同),它其实就是 Equinox 的 OSGi R4 Core 的实现。如果采用的不是 Eclipse 3.1 之后的版本,建议下载一个 Eclipse 3.1 之后的版本。

下面我们来检查环境,首先启动 Eclipse。

>第一步,打开 Run Configurations 对话框(见图 1-1)。

【图 1-1 运行配置菜单 】
**>**第二步,创建 OSGi Framework 类型的新的运行配置(见图 1-2)。

【图 1-2 创建运行配置 】
**>**第三步,显示所有的 Bundles(见图 1-3)。

【图 1-3 显示 Bundles】
**>**第四步,取消对 Bundles 的选择(见图 1-4)。

【图 1-4 取消对 Bundles 的选择 】
**>**第五步,选择 org.eclipse.osgi 这个 Bundle(见图 1-5)。

【图 1-5 选中 Bundle 后的显示 】
**>**第六步,运行。 点击 Run 按钮,如果 Console 中出现“osgi>”并且没有错误信息,说明环境已经正常了。我们可以在 osgi>提示符后输入 ss,然后回车。将会看到如图 1-6 所示的界面。

【图 1-6 运行结果显示 】

环境已经准备好了。下面来开始我们的第一个 OSGi 的应用。

1.1.3 HelloWorld

在这一节中,我们将完成一个 HelloWorld 的例子。之前大家应该看到过 Java 语言、C 语言或 C++ 等语言中的 HelloWorld,那些 HelloWorld 程序都是在运行后输出一个“Hello World”,然后就结束了程序。我们今天的 HelloWorld 例子程序主要的功能是在启动和停止一个 Bundle 的时候来做些事情(输出信息)。下面我们就一步一步完成第一个 Bundle。

>第一步,创建 Bundle 工程。

在 Eclipse 中创建一个 Plug-in 工程(见图 1-7)。

【图 1-7 创建插件工程 】

输入工程相关的信息,这里和创建普通的 Java 工程唯一的不同点就是要选择 this plug-in is targeted to run with,在这里选择 an OSGi framework 的 standard 选项,也就是说建立一个标准的 OSGi Bundle 工程(见图 1-8)。

输入 Bundle 的相关元数据信息(见图 1-9)。
  • Plug-in ID 指的是 Bundle 的唯一标识,在实际的项目中可以采用类似 java 的包名组织策略来保证标识的唯一性;
  • Plug-in Version 指的是 Bundle 的版本;
  • Plug-in Name 指的是 Bundle 的更具有意义的名称;
  • Plug-in Provider 指的是 Bundle 的提供商;
  • Execution Environment 指的是 Bundle 运行需要的环境;
  • 剩下的关键的就是 Activator 部分了,这里填入自己的一个类名就可以了,在工程建立时 Eclipse 会自动建立这个类。

【图 1-8 插件工程设置 】

【图 1-9 插件信息设置 】

完成了 Bundle 工程的创建后,在 Package 视图中就可以看到如图 1-10 这样的视图,表明工程创建成功了。

【图 1-10 插件工程内容 】

>第二步,完成 Activator 的代码。

打开默认的 HelloWorldActivator.java 代码(见图 1-11)。

【图 1-11 默认 Activator 代码 】
可以看到 HelloWorldActivator 实现了 BundleActivator 接口,然后 HelloWorldActivator 中有两个空的方法——start 和 stop。其中,start 方法是在 Bundle 被启动的时候调用的,stop 是在 Bundle 被停止的时候调用的,下面我们在这两个方法中加入代码(见图 1-12)。

【图 1-12 修改后的 Activator 代码 】

HelloWorld 的例子已经完成了,下面看这个例子的运行效果。

>第三步,运行。

首先创建一个 HelloWorld 用的运行配置(见图 1-13)。

【图 1-13 运行配置的 Bundles 】

然后我们设置 HelloWorld 的 Auto-Start 属性为 false,并且将 Target Platform 中不需要的 Bundle 去掉。
再直接点击 HelloWorld 这个 Bundle 配置行后面的 Auto-Start 列的 default,在下拉框中选择 false,并点击 Target Platform 前的钩,使得 Target Platform 下面的项都变为不选择状态。接着我们点击右侧的“Add Required Bundles”,这个时候发现 Target Platform 前的方框变为部分选择的状态,后我们选中“Only show selected bundles”。这样就完成了运行配置的设置(见图 1-14)。

【图 1-14 运行配置的 Bundles 】

后点击“Run”,在 Console 中出现“osgi>”提示。这表明已经成功启动了我们的第一个 OSGi 应用。
在 osgi>提示符下输入 ss,然后回车,我们可以看到如图 1-15 所示的显示。

【图 1-15 运行结果 】
可以看到,HelloWorld Bundle 已经被安装并且完成了解析,但是还没有启动。下面我们在 osgi> 提示符下输入 start 1,然后回车,看看会发生什么。这个时候再输入 ss。应该有如图 1-16 所示的显示。

【图 1-16 启动 Bundle 后的结果 】

我们可以看到输出了“HelloWorldBundle started!”,并且通过 ss 命令,看到 HelloWorld Bundle 的状态从前面的 RESOVLED 变成了 ACTIVE,说明我们的 HelloWorld Bundle 已经成功启动了。并且在 Activator 的 start 方法中加入的输出信息也正确打印出来了。

接着,我们输入 stop 1,并且再用 ss 命令查看 Bundle 的状态,会得到如图 1-17 所示的反馈。

【图 1-17 停止 Bundle 后的结果 】

这个时候 HelloWorld Bundle 已经被停止。我们在 Activator 中加入的输出信息正确地输出在了 Console,并且通过 ss 命令看到 HelloWorld Bundle 的状态从刚才的 ACTIVE 变为了 RESOLVED。

到这里我们完成了第一个 OSGi Bundle,也尝试运行了第一个 OSGi 的程序。在下面的章节,将会看到更加复杂一些的例子。


wmz 2015-11-03 18:48

JXADF最成熟、最NB的开源OSGI快速开发平台。<br>http://osgi.jxtech.net<br>

顶(2) 踩(0) 回复

tmfei 2013-09-17 13:18

我用eclipse juno,出现异常是:<br>org.osgi.framework.BundleException: Could not find bundle: org.eclipse.equinox.console <br><br>解决方法,参见http://blog.csdn.net/just_arthur/article/details/8664492<br><br>希望对大家有用

顶(1) 踩(0) 回复

tmfei 2013-09-17 12:54

刚开始学习OSGI!顶楼主!

顶(0) 踩(0) 回复

litianyu0815 2013-09-16 16:34

第一天学习OSGI!支持楼主!

顶(0) 踩(0) 回复
查看评论