前面简单说了一下OSGI,这只是一个框架。想运行各种程序,就需要编写不同的Bundle。OSGI在需要的时候可以下载并安装Bundle,在不需要的时候可以将他们删除。每个Bundle可以独立运行,也可以依赖其它Bundle而存在。
编写Bundle,最主要是继承OSGI提供的接口。
public class Activator implements BundleActivator {
public void start(BundleContext bc) {
}
public void stop(BundleContext bc) {
}
}
可以看到,我们的类Activator继承于BundleActivator接口,并实现start和stop方法。这里的Start方法说白了相当于main入口函数。例如写一个Swing的应用程序,那么界面的初始化和显示就应该写在Start方法里。OSGI就是查找这个方法对Bundle进行启动的。
下载最新的knopflerfish测试环境。网址www.Knopflerfish.org。将程序打包成JAR文件,要包含MF文件,MF文件中包含Bundle部署需要的各种信息。
举个MF文件的例子。
Manifest-Version: 1.0
Bundle-SymbolicName: my bundle
Bundle-Name: my bundle
Bundle-Version: 1.0
Bundle-Activator: Activator
Import-Package: org.osgi.framework
大概意思看看名称就明白了。其中Bundle-Activator是启动Bundle的入口类。
将JAR文件放入环境中运行。例如,在jars目录下创建My目录,然后将自己的my.jar文件拷贝到My目录下。然后修改XARGS文件(win2k就修改init_Windows2000.xargs,winxp修改init_WindowsXP.xargs),依次写入下面两行:
-install My/my.jar
-start My/my.jar
意义很明显。然后执行start.bat就可以看到Bundle运行的效果了。如果找不到start.bat,也可进入命令行,进入主目录,执行:
java -jar framework.jar
需要注意的是:每次执行程序,都会自动生成fwdir目录,这个目录记录了上次的信息,如果程序重新编译,JAR文件被重新导入,则需要删除整个fwdir目录,再执行start.bat。