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

参考文章:http://osgi.com.cn/article/tagged/4002946

Equinox

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

环境搭建:

既然是基于 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 对话框
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第1张图片
第二步,创建 OSGi Framework 类型的新的运行配置
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第2张图片
第三步,显示所有的 Bundles
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第3张图片
第四步,点击"Deselect All"按钮,取消对 Bundles 的选择。选择 org.eclipse.osgi 这个 Bundle
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第4张图片
第六步,运行。 点击 Run 按钮,如果 Console 中出现“osgi>”并且没有错误信息,说明环境已经正常了。我们可以在 osgi>提示符后输入 ss,然后回车。
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第5张图片

就在这时,竟然报错了。解决错误的方法是加入以下OSGI依赖的Bundler
org.eclipse.osgi
org.apache.felix.gogo.shell
org.apache.felix.gogo.runtime
org.apache.felix.gogo.command
org.eclipse.equinox.console

OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第6张图片
然后再运行,已经成功搭建了此环境:
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第7张图片

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

HelloWorld

第一步,创建 Bundle 工程:
  • 在 Eclipse 中创建一个 Plug-in 工程
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第8张图片
  • 输入工程相关的信息,这里和创建普通的 Java 工程唯一的不同点就是要选择 this plug-in is targeted to run with,在这里选择 an OSGi framework 的 standard 选项,也就是说建立一个标准的 OSGi Bundle 工程。
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第9张图片
  • 输入 Bundle 的相关元数据信息。
    • Plug-in ID 指的是 Bundle 的唯一标识,在实际的项目中可以采用类似 java 的包名组织策略来保证标识的唯一性;
    • Plug-in Version 指的是 Bundle 的版本;
    • Plug-in Name 指的是 Bundle 的更具有意义的名称;
    • Plug-in Provider 指的是 Bundle 的提供商;
    • Execution Environment 指的是 Bundle 运行需要的环境;
    • 剩下的关键的就是 Activator 部分了,这里填入自己的一个类名就可以了,在工程建立时 Eclipse 会自动建立这个类。
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第10张图片
  • 完成了 Bundle 工程的创建后,在 Package 视图中就可以看到如图 1-10 这样的视图,表明工程创建成功了。
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第11张图片
查看Bundler元数据信息
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第12张图片
第二步,完成 Activator 的代码
  • 打开默认的 HelloWorldActivator.java 代码
package com.csii.demo;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class HelloWorldActivator implements BundleActivator {

	private static BundleContext context;

	static BundleContext getContext() {
		return context;
	}

	/*
	 * (non-Javadoc)
	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
	 */
	public void start(BundleContext bundleContext) throws Exception {
		HelloWorldActivator.context = bundleContext;
	}

	/*
	 * (non-Javadoc)
	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
	 */
	public void stop(BundleContext bundleContext) throws Exception {
		HelloWorldActivator.context = null;
	}
}
  • 可以看到 HelloWorldActivator 实现了 BundleActivator 接口,然后 HelloWorldActivator 中有两个空的方法——start 和 stop。其中,start 方法是在 Bundle 被启动的时候调用的,stop 是在 Bundle 被停止的时候调用的,下面我们在这两个方法中加入代码:
package com.csii.demo;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class HelloWorldActivator implements BundleActivator {

	private static BundleContext context;

	static BundleContext getContext() {
		return context;
	}

	/*
	 * (non-Javadoc)
	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
	 */
	public void start(BundleContext bundleContext) throws Exception {
		HelloWorldActivator.context = bundleContext;
		System.out.println("HelloWorld Bundle start");
	}

	/*
	 * (non-Javadoc)
	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
	 */
	public void stop(BundleContext bundleContext) throws Exception {
		HelloWorldActivator.context = null;
		System.out.println("HelloWorld Bundle stop");
	}

}
HelloWorld 的例子已经完成了,下面看这个例子的运行效果。
第三步,运行
  • 首先创建一个 HelloWorld 用的运行配置
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第13张图片
  • 然后我们设置 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”。这样就完成了运行配置的设置
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第14张图片

OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第15张图片

  • 点击“Run”,在 Console 中出现“osgi>”提示。这表明已经成功启动了我们的第一个 OSGi 应用。在 osgi>提示符下输入 ss,然后回车
我们可以看到输出了“HelloWorldBundle started!”,并且通过 ss 命令,看到 HelloWorld Bundle 的状态从前面的 RESOVLED 变成了 ACTIVE,说明我们的 HelloWorld Bundle 已经成功启动了。并且在 Activator 的 start 方法中加入的输出信息也正确打印出来了。

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


到这里我们完成了第一个 OSGi Bundle,也尝试运行了第一个 OSGi 的程序
OSGi原理与最佳实践:第一章 OSGi框架简介(1)Equinox_第16张图片





你可能感兴趣的:(OSGI)