Spring与OSGi的整合(一)(转)

时间:2024-03-30 12:46:30

1. 开发环境的准备

现在的eclipse都已经包含了Equinox,无需单独下载。
下载最新版的Spring DM,Spring官方网站:www.SpringSource.org
2. 开发OSGi的HelloWorld应用程序

在这一节,我们将开发一个OSGi bundle,演示如何利用Equinox进行OSGi bundle的开发、运行及调试,为之后的示例做准备。
首先,新建一个Plug-in工程,如下图所示:
 Spring与OSGi的整合(一)(转)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

下一步,注意选择目标平台,默认为Eclipse version *,将其改成Equinox,如下图所示:

Spring与OSGi的整合(一)(转)

之后按默认下一步即可,到最后一步时,无需根据模板创建工程,去掉默认的勾,如下图:

Spring与OSGi的整合(一)(转)

点击完成,创建的工程目录如下图所示:

 Spring与OSGi的整合(一)(转)

从图中,可以看到,eclipse为工程自动生成了一个Activator类,如下所示:

Java代码 Spring与OSGi的整合(一)(转)
  1. package helloworld;   
  2.   
  3. import org.osgi.framework.BundleActivator;   
  4. import org.osgi.framework.BundleContext;   
  5.   
  6. public class Activator implements BundleActivator {   
  7.   
  8.     /*  
  9.      * (non-Javadoc)  
  10.      * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)  
  11.      */  
  12.     public void start(BundleContext context) throws Exception {   
  13.         System.out.println("Hello World!");   
  14.     }   
  15.   
  16.     /*  
  17.      * (non-Javadoc)  
  18.      * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)  
  19.      */  
  20.     public void stop(BundleContext context) throws Exception {   
  21.     }   
  22.   
  23. }  
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选择运行方式,如下图所示:

Spring与OSGi的整合(一)(转)

弹出如下对话框: 

Spring与OSGi的整合(一)(转)

 

在弹出的对话框中,新建一个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。

类别

命令

含义

控制框架

launch

启动框架

shutdown

停止框架

close

关闭、退出框架

exit

立即退出,相当于 System.exit

init

卸载所有 bundle(前提是已经 shutdown

setprop

设置属性,在运行时进行

控制 bundle

install

安装

uninstall

卸载

start

启动

stop

停止

refresh

刷新

update

更新

展示状态

status

展示安装的 bundle 和注册的服务

ss

展示所有 bundle 的简单状态

services

展示注册服务的详细信息

packages

展示导入、导出包的状态

bundles

展示所有已经安装的 bundles 的状态

headers

展示 bundles 的头信息,即 MANIFEST.MF 中的内容

log

展示 LOG 入口信息

其它

exec

在另外一个进程中执行一个命令(阻塞状态)

fork

EXEC 不同的是不会引起阻塞

gc

促使垃圾回收

getprop

得到属性,或者某个属性

控制启动级别

sl

得到某个 bundle 或者整个框架的 start level 信息

setfwsl

设置框架的 start level

setbsl

设置 bundle start level

setibsl

设置初始化 bundle start level

 

至此,我们已经成功的演示了helloworld,初步了解了OSGi的bundle是如何开发并运行的,下面将进入我们的正题,下面我们将通过一个稍微复杂的示例,讲解bundle之间如何进行包依赖、注册及调用服务。

 

未完待续。。