您的位置:首页 > 产品设计 > UI/UE

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

2016-12-28 22:38 716 查看
参考文章: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 Framework 类型的新的运行配置



第三步,显示所有的 Bundles



第四步,点击"Deselect All"按钮,取消对 Bundles 的选择。选择 org.eclipse.osgi 这个 Bundle



第六步,运行。 点击 Run 按钮,如果 Console 中出现“osgi>”并且没有错误信息,说明环境已经正常了。我们可以在 osgi>提示符后输入 ss,然后回车。



就在这时,竟然报错了。解决错误的方法是加入以下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 的应用。

HelloWorld

第一步,创建 Bundle 工程:

在 Eclipse 中创建一个 Plug-in 工程



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



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



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



查看Bundler元数据信息



第二步,完成 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 用的运行配置



然后我们设置 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”。这样就完成了运行配置的设置





点击“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 的程序



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: