Spring OSGi的整合

日期: 2010-01-11 作者:中国IT实验室 来源:TechTarget中国 英文

    OSGi的强大还在于它的声明式服务(DS-DeclarativeServices),乍一看,和Spring的依赖注入(DI- DependencyInjection)很相像,于是不免会想到OSGi是否会对Spring产生巨大的冲击呢?其实这种担心完全没有必要,相反二者的结合反而会让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的插件配置还有好多,只是由于手头缺少资料,也没有尝试。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • Spring针对Java 8升级

    Java 8刚刚在几周前发布。后来Spring Framework项目负责人发表了题为《企业项目中的Java 8》的文章。文中,指出那些著名的Java EE应用服务器如何不允许轻松升级。

  • 软件项目成功:项目的处理

    在软件项目成功的因素中有我们谈及了问题域和社区,然这两者并不是软件项目本身。你可以把分类当作问题领域连续讨论几个星期,但分类的问题跟实际执行分类的库并不一样。

  • Rails 4.1改进启动时间和响应布局

    在经历了两个候选版本后,Rails团队刚刚发布了Rails 4.1.0。以“单点版本(point release)”发布意在说明更改向后兼容,可以无痛升级。

  • OSGi中该使用Blueprint还是声明式服务?

    在OSGi中,服务是实现bundle间交互和应用灵活性的基石。借助于服务,我们能够降低bundle之间的耦合,更加有利于软件的重用。