关于eclipse加载bundle的问题的一些讨论

这两天主要是为GMF的环境的事情弄的焦头烂额,问题很多,而自己一开始的时候没有注意到这些问题(尤其是插件之间的版本的依赖关系),导致弄了很长时间。

首先说明我碰到的问题:
1.application id not found.
2.找不到对应的bundle问题.

主要是围绕这两个问题查了很多资料,原来不了解osgi,后来查了osgi相关的概念,总算理解了一些,但是当时问题还是没有解决。

  在加载一个插件的时候,manifest.mf文件中会列出必须加载的插件,这些加载的插件之间有一些依赖关系,这种依赖关系包含版本号。我分析这种依赖关系的加载顺序是在加载第一个bundle时,发现require bundles中存在某个bundle,则去加载此bundle,依此递推。关键的问题在于不同的bundle之间存在某些依赖,而这种依赖是版本相关的。一开始的时候我没注意到这些问题,只知道copy相应的插件就可以,但实际上这样不可以。因为虽然此时编译不会出错(因为所有的对应类都能找到),但是osgi在插件装载的时候会检测插件版本,因此这也是不行的。

  像这种bundle装载时有一种跟踪技巧,因为很多时候一旦发生这种问题,信息太多了,多得你无法看完全部信息,而单纯的看前面的几个信息,可能会忽略一些细节问题,比如,对于所有的必须插件,你认为已经全部在target中了,当然,版本信息忽略,此时大家怎么想都想不到是版本问题。因此,当你发现第一个bundle没有加载成功的时候,需要跟踪进去看该资源为什么没有被加载进来,是由于哪个资源没被加载进来导致的。就像程序的调试一样,当一步步的跟踪到深层的原因之后之后,可以检查一下对应的插件是否存在,如果存在,还要注意到版本问题,到了此时,大家就会明显的注意到版本问题了。

由此的经验教训时,对于eclipse的插件开发尤其注意版本问题。

   此时也要注意两种的eclipse安装插件方式,(同时plugin.xml文件中的一些特定信息,如要求的jdk的版本号),如果单纯的利用eclipse的更新安装插件不会有任何问题,如果直接下载sdk安装则需要查一下sdk与eclipse的版本之间的对应关系。否则导致插件之间的版本依赖关系问题,导致运行问题。后一种方式比较的tricky,因为同样是jar包引入,但是它不会导致在eclipse编译问题,而直到运行的时候才会发生错误,这时候就很迷茫了。。因为我们作为程序员,我们不担心编译问题,但我们就怕运行时问题。(好像这句话不是我原创的,也不知道在哪本书上看到大意类似这样的句子,^_^)。

  记得以前版本管理时有人说过,team成员之间最好使用的工具版本应一致,甚至采用的工作目录都应该一致,否则会造成一些配置环境问题。
  所以典型的问题是:rcp中采用了之前某个版本的eclipse的插件,而原开发人员可能刚好他的开发工具版本与此一致,因此在原开发人员的机器上不存在问题。而在没有原开发人员的通知下,新开发人员可能使用新版本的eclipse,因此在此种情况下,原开发人员在原eclipse的基础上安装插件进而再次开发不会碰到插件问题,而新开发人员就会碰到插件相关的版本问题了。
   所以,从软件项目的管理上来说,保持一致的开发环境是相当必要的。


之前还碰到过一个问题(编译问题是:路径不完整,类无法直接引用),就是原来的rcp在eclipse 3.4中能够运行的很好,但是转移到3.6之后却出现了编译错误,理解了上面这些问题之后,今天我再试了一次,问题很容易的就搞定了。解决的办法其实很简单,就是在相应的manifest.mf中加入相应的类所在的bundle名称,就能搞定这个问题了。

不过3.6和3.4比,有点不一样,target platform 配置的方式不同,另外,在程序启动的时候,控制台打印出的消息也不同。3.6打印的输出信息更多。

你可能感兴趣的:(eclipse,jdk,配置管理,项目管理,osgi)