1. 开发环境的准备
现在的eclipse都已经包含了Equinox,无需单独下载。
下载最新版的Spring DM,Spring官方网站:www.SpringSource.org
2. 开发OSGi的HelloWorld应用程序
在这一节,我们将开发一个OSGi bundle,演示如何利用Equinox进行OSGi bundle的开发、运行及调试,为之后的示例做准备。
首先,新建一个Plug-in工程,如下图所示:
下一步,注意选择目标平台,默认为Eclipse version *,将其改成Equinox,如下图所示:
之后按默认下一步即可,到最后一步时,无需根据模板创建工程,去掉默认的勾,如下图:
点击完成,创建的工程目录如下图所示:
从图中,可以看到,eclipse为工程自动生成了一个Activator类,如下所示:
- package helloworld;
- import org.osgi.framework.BundleActivator;
- import org.osgi.framework.BundleContext;
- public class Activator implements BundleActivator {
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
- */
- public void start(BundleContext context) throws Exception {
- System.out.println("Hello World!");
- }
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
- */
- public void stop(BundleContext context) throws Exception {
- }
- }
package helloworld;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext context) throws Exception {
System.out.println("Hello World!");
}
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext context) throws Exception {
}
}
有过eclipse插件开发经验的人应该很快就能明白,这就是该工程——实际上就是上一篇文章中所称的bundle在Equinox平台中的启动入口,相当于我们的熟悉的main函数,如果将该bundle运行到Equinox中,首先进入该bundle的是Activator的start方法,你可以将相关的服务、资源在该方法内完成向bundleContext的注册——文章后面会具体讲到相关内容。在运行期,如果想要该bundle停止运行,Equinox平台将调用Activator的stop方法,你可以在该方法内完成资源的注销等工作。
下面我们将要完成首次的Equinox运行,将向大家展现bundle到底是如何运行起来的。为helloworld选择运行方式,如下图所示:
弹出如下对话框:
在弹出的对话框中,新建一个OSGi Framework运行环境(双击OSGi Framework即可,这里为其取名Equinox),选中helloworld(1.0.0),然后点击右边的Add Required Bundles按钮,eclipse将自动选中运行helloworld的依赖bundle,如果有必要,可以点击右下的Validate Bundles验证按钮,验证程序正常运行所需的bundle是否都被选中,最后点击运行,回到控制台:
osgi> Hello World!
可以看到,之前在Activator的start方法中的输出语句已经被输出到控制台,我们可以通过命令ss查看Equinox的运行情况,可以看到一共运行了两个bundle,如下:
ss
Framework is launched.
id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.3.R34x_v20081215-1030
1 ACTIVE helloworld_1.0.0
还记得之前讲到过的bundle的几种状态吧?helloworld已经运行起来了。
那么Equinox具体支持哪些命令呢?下表列出了主要的一些命令,如需查看更详细的命令清单,则可以在控制台键入help。
类别 |
命令 |
含义 |
控制框架 |
|
启动框架 |
|
停止框架 |
|
|
关闭、退出框架 |
|
|
立即退出,相当于 System.exit |
|
|
卸载所有 bundle(前提是已经 shutdown) |
|
|
设置属性,在运行时进行 |
|
控制 bundle |
|
安装 |
|
卸载 |
|
|
启动 |
|
|
停止 |
|
|
刷新 |
|
|
更新 |
|
展示状态 |
|
展示安装的 bundle 和注册的服务 |
|
展示所有 bundle 的简单状态 |
|
s |
展示注册服务的详细信息 |
|
|
展示导入、导出包的状态 |
|
|
展示所有已经安装的 bundles 的状态 |
|
|
展示 bundles 的头信息,即 MANIFEST.MF 中的内容 |
|
|
展示 LOG 入口信息 |
|
其它 |
|
在另外一个进程中执行一个命令(阻塞状态) |
|
和 EXEC 不同的是不会引起阻塞 |
|
|
促使垃圾回收 |
|
|
得到属性,或者某个属性 |
|
控制启动级别 |
|
得到某个 bundle 或者整个框架的 start level 信息 |
|
设置框架的 start level |
|
|
设置 bundle 的 start level |
|
|
设置初始化 bundle 的 start level |
至此,我们已经成功的演示了helloworld,初步了解了OSGi的bundle是如何开发并运行的,下面将进入我们的正题,下面我们将通过一个稍微复杂的示例,讲解bundle之间如何进行包依赖、注册及调用服务。
未完待续。。