OSGi的强大还在于它的声明式服务(DS-DeclarativeServices),乍一看,和Spring的依赖注入(DI- DependencyInjection)很相像,于是不免会想到OSGi是否会对Spring产生巨大的冲击呢?其实这种担心完全没有必要,相反二者的结合反而会让OSGi如虎添翼,强者更强。
51CTO编辑推荐:OSGi入门与实践全攻略
Spring组织早在2006年已经开始了OSGi的整合工作,由于OSGi独特的类加载机制和一些其他的第三方类包不同,所以整合有一定难度进展比较缓慢。类加载问题也将是我们在使用OSGi开发时遇到的最多的问题。
第一步先搞定Spring的jar包。据说Spring2.1会支持OSGi,为省点力气我采用的是Spring2.1m3版,里面的jar包已经开始支持OSGi,但类库中没有加入OSGi的整合类库,比较郁闷。下载后的jar包需要修改一下里面的元数据文件MANIFEST.MF,找到Import-Package,将org.osgi.framework的版本修改为1.4.0,这个OSGi类库在Eclipse3.3版本中提供有。然后在文件末尾添加DynamicImport-Package:*,免得调试的时候总找不到类定义。
这里我提一个建议:用Eclipse创建一个插件工程,将Spring的类库导入,作为我们使用的Spring库,而不是从官方网站下载的。这样一者有助于我们理解OSGi的类加载机制,确定程序在运行时到底需要依赖那些类包,为什么依赖;二者有助于以后我们自己创建自己的插件。唯一的缺点就是需要不时的处理NoClassDefFoundError。
第二步搞定OSGi的整合类库,先到http://www.springframework.org/osgi下载最新的Spring OSGi整合类库,最新的版本是1.0M2。一共3个jar包:core、extender、io,然后分别打开jar包,修改 MANIFEST.MF文件。在文件中找到Import-Package,将引用的Spring版本修改为所使用的Spring版本,例如我使用的是 2.1。
第三步设置Eclipse插件环境,这一步比较麻烦。
首先添加和设置jar包。将Spring OSGi的3个jar包,放到Eclipse安装目录的plugins目录下,为更好的识别和修改,建议采用Eclipse插件的link机制,单独建一个目录来放我们的测试jar 包。另外还需要支持Spring的jar包(下载Spring2.1时自带的),包括:asm,backport-util- concurrent,cglib-nodep,commons-attributes,commons-collections,aspectj,由于我在做OSGi、Spring和Hibernate的整合,所以有些是支持Hibernate的。好了现在该启动Eclipse,打开Windows->Preferences->Plug- inDevelopment->TargetPlatform,在右侧会看到Eclipse加载的所有插件包,选中我们需要的(除了上面提到的之外):org.eclipse.osgi,org.eclipse.osgi.util,org.eclipse.equinox.log(如果没有这个,需要到Eclipse官网下载Equinox的jar包)。
然后打开Run->OSGiFramework->Bundles,创建一个运行环境,把我们上一步添加的jar包选中,特别将 spring osgi-extender的插件的启动级别改为2。现在来运行一下,在Console窗口的命令提示符(osgi>)下,输入 ss,就可以看到各个Bundle的状态;输入log可以看到启动的日志。随意输入其它非OSGi命令的字符都可以看到命令帮助文档,这点可以测试一下。
如果所有的Bundles都启动了,没有报错,那就表明我们的配置没有什么大的问题。但不代表一切正常,因为Bundle启动时不会对可选择的类库导入进行检查,虽然启动了但却不能用,而且没有任何重要信息提示,这是后来郁闷我很久的重要原因。这时我们就需要用到插件调试模式了(不是指Run-Debug 的调试),打开Run->OSGiFramework->Arguments,在Programarguments窗口的参数最后面加上"-debug"就可以打开调试模式。先别高兴,这只是第一步。检查Eclipse目录下是否有一个“.options”文件,如果没有,就到 plugins目录下找org.eclipse.osgi_$version.jar,将这个jar包中的“.options”文件copy一份放到 Eclipse目录下。打开这个文件就可以看到好多跟debug相关的配置,把org.eclipse.osgi/debug的配置改成true,就可以了。如果想看更多的debug信息,可以自己决定修改其余的配置。
然后再来运行一下,Console居然出来了无数行的插件调试信息,有点头大,在参数中去掉“-debug”它们就销声匿迹了。
关于Eclipse的插件配置还有好多,只是由于手头缺少资料,也没有尝试。
【编辑推荐】