因为正看一个基于Felix的开源程序,今天搭配了Felix的开发环境。
如何利用Eclipse调试Felix bundle,在Felix的网站上有介绍。可见网址http://felix.apache.org/site/integrating-felix-with-eclipse.html 。
另外,在《OSGi原理与最佳实践》上也有关于搭配Felix 开发环境两种方法的介绍。(应该说后者其实就是copy前者Felix网站上的东东)。
但是这两个在讲完环境搭配之后如何调试却一笔带过,反而让人搭配了环境却不知如何用。在此总结一下自己的心得。
这里对不采用Pax runner的方法做点补充。
备注:Pax cursor已经更新为Pax runner,具体内容就去google吧。
第一步:搭配一个专用于调试的Java Project——felix。
按照http://felix.apache.org/site/integrating-felix-with-eclipse.html 上的说明,建立一个java project。上面步骤将的非常清晰了。
按照他的步骤搭配完毕,将会获得一个专门用于调试bundle 程序的Java project——Felix。很明显,其实他就是吧Felix在eclipse中医project的形式运行而已,console窗口就是Felix的命令行窗口。操作当然相同。
我将这个称之为调试环境。注意不要再另外在该project中添加自己的东西了。
第二步:编写自己的程序。
因为Felix的bundle都是符合OSGI standard的,所以Felix下的bundle就是标准的OSGI bundle。如有怀疑这一点,可以去Felix的网站上常见问题里去找答案,提示一下第一个问题就是答案。
因此在eclipse中,我们新建Felix的bundle,可以利用Eclipse插件向导来做,只需要注意选择OSGI standard即可,在元文件编辑窗中不要去填写用于Equinox的那些属性就可以了。
具体步骤可以参考建立Eclipse 插件工程的步骤。这个Google一下即可。《osgi实战》也有介绍。
开发完自己的bundle之后。打包,Export为plug-in fragments。注意将Export的文件夹地址可以直接设置为刚才创建的Felix project中的bundle文件夹。当然也可以导出到某个位置再将其拷贝到该bundle目录下。
第三步:调试程序。
# 在你的程序中设置所需的断点。
# 启动Felix project,进入debug模式,注意确保先前设置的debug configuration正确无误。
这样Felix 将会自动将bundle文件夹下你的bundle运行调试,如果你没有进入调试模式,会提示你进入。
# 此时,debug会出现找不到源文件,点击attach source,选择add project,然后选择刚才要调试的那个project的名称 即可。eclipse会自动搜索到源文件。如果你的debug窗口中正常显示了你的源程序,恭喜!成功了。你此时会发现程序
正停留在你设置的断点处等待你调试。这时和调试普通程序没什么区别。
如果你对程序进行了修改,那么重新打包一次至于bundle文件夹下,重新启动felix project 进入debug模式,Felix会自动导入你修改过的bundle。
如果要建立多个bundle,重复就行了。
总结:
# 先建立一个干干净净的Felix Javaproject作为调试环境。然后正常编写一个bundle,将其置于Felix下的bundle目录调试即可,最重要的是添加source路径使其能找到源码位置。
# 有人可能有不同意见,认为本人这样太麻烦了。当然,我们将这两个工程作为一个工程就可以调试,大可不必分开,但是如果你要调试很多bundle,这种优越性就显示出来了。
@ 你只需要建一个Felix 调试环境,而不必为每个bundle都重复这个工作。
@ 要知道调试一个bundle和调试多个bundle是不同的。当你编写的bundle相互有依赖关系,那你必然要把他们放到一个Felix下运行才对,想想每个bundle单独构建一个调试环境的结果会是什么?
@ 你还可以在这个Felix下检查到多个bundle之间的交互,及早发现可能存在的冲突
@ 当你把所有的bundle调试完成,也就同时部署完成了,只要没有问题,Felix project正是部署好你的项目的服务器,可以直接把该project拷贝出来用,当然删掉eclipse的专用文件就更干净了,如.setting文件夹。
@ 另外,又想到一点,分为两个project,你在导出时无需更多设置直接导出为plug-in就是所要的bundle包。如果放在一个Java project中,将Java project导出为能用的bundle恐怕还需要你手动设置
参考网站:
http://felix.apache.org/site/integrating-felix-with-eclipse.html