目的:尝试开发一个Hello World bundle ,并与KNIME的bundle实现通信,可以注册到KNIME的OSGi中。
启动Eclipse,依次点 File --> New --> Project。选择Plug-in Project–>next。如图1
图一
输入Project Name项目名称,比如com.howard.sample.HelloWorld,Target Platform(目标平台)里的an OSGI framework,选择standard。剩下的保持默认next。
下个对话框也默认,next。然后选择Hello OSGI Bundle作为模版。点击Finish。如图2。
图二
Eclipse会为你创建Hello world bundle的模版代码。主要包含两个文件:如图3
图3
Activator.java和MANIFEST.MF。
Activator.java的代码如下所示:
Java代码
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
public void start(BundleContext context) throws Exception {
System.out.println("Hello world");
}
public void stop(BundleContext context) throws Exception {
System.out.println("Goodbye World");
}
}
如果你的bundle在启动和关闭的时候需要被通知,你可以考虑实现BundleActivator接口。以下是定义Activator的一些注意点:
- 你的Activator类需要一个公有的无参数构造函数。OSGI框架会通过类反射的方式来实例化一个Activator类。
- 容器启动bundle过程中负责调用你的Activator类的start方法。bundle可以在此初始化资源比如说初始化数据库连接。start方法需要一个参数,BundleContext对象。这个对象允许bundles以取得OSGI容器相关信息的方式和框架交互。如果某一个bundle有异常抛出,容器将对该bundle标记为stopped并不将其纳入service列表。
- 容器关闭的时候会调用你的Activator类方法stop(),你可以利用这个机会做一些清理的操作。
MANIFEST.MF
这个文件是你的bundle的部署描述文件。格式和Jar里的MANIFEST.MF是一样的。包含的不少名值对,就像如下:Xml代码
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloWorld Plug-in
Bundle-SymbolicName: com.howard.sample.HelloWorld
Bundle-Version: 1.0.0
Bundle-Activator: com.howard.sample.helloworld.Activator
Bundle-Vendor: HOWARD
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0"
分别来看下:
Bundle-ManifestVersion
数值为2意味着本bundle支持OSGI规范第四版;如果是1那就是支持OSGI规范第三版。
Bundle-Name
给bundle定义一个短名,方便人员阅读
Bundle-SymbolicName
给bundle定义一个唯一的非局部名。方便分辨。
Bundle-Activator
声明在start和stop事件发生时会被通知的监听类的名字。
Import-Package
定义bundle的导入包。
Hello World bundle完成了,接下来我们运行一下。
执行bundle
点击Run --> Run Configuration
在左边的OSGI Framework选项里右键 new ,创建一个新的OSGI Run Configuration名字随便取好了,我们取个OSGi hello world。如图4
图4
OSGI控制台
OSGI控制台是一个OSGI容器的命令行界面。你可以利用它做些诸如启动,关闭,安装bundles,更新和删除bundles等操作。现在,点击OSGI控制台所在的位置,回车,你就会发现可以输入命令了。这时的OSGI控制台应该如下图5:
图5
下面列出一些常用的OSGI命令,你可以试着和OSGI容器交互。
ss 显示已安装的bundles的状态信息,信息包括bundle ID,短名,状态等等。
start 启动一个bundle
stop 关闭一个bundle
update 载入一个新的JAR文件更新一个bundle
install 安装一个新的bundle到容器中
uninstall 卸载一个已在容器中的bundle
。