在RCP中应用OSGI的DS(Declarative Service)服务,特别要注意各个Bundle(插件)的启动顺序,其中org.eclipse.equinox.ds_1.0.0.v20080427-0830.jar(DS服务的Bundle)这个Bundle要比其他需要DI Service的Bundle启动要早,同时又要比它依赖的Bundle启动要迟。equinox的DS插件依赖如下:
1.org.eclipse.osgi.services_3.1.200.v20071203.jar
2.org.eclipse.equinox.util_1.0.0.v20080414.jar(该插件又依赖1)
所以启动DS时如果设置了启动级别就要确保上面两个Bundle已经启动了,我们以一个RCP导出的conf.ini配置文件为例,其部分内容如下:
osgi.bundles.defaultStartLevel=4
osgi.bundles=org.eclipse.equinox.common@2:start,org.eclipse.update.configurator@3:start,
org.eclipse.core.runtime@start,org.eclipse.equinox.ds@3:start
我们可以看到默认的Bundle的启动级别为4,我们这里把ds的Bundle的启动级别设置为3,这样可以保证在其他Bundle启动前启动DS服务,同时其依赖的两个Bundle也会在它之前启动:-)
另外,如果某个Bundle使用DS发现无法引用service,请确保该bundle已经启动了(处于Activate状态),因为只有启动了的Bundle才可以激活Component。调试RCP程序,可以在导出的RCP程序的eclipse.exe(根据你的product的配置不同而不同)所在的目录建立startup.bat文件,内容如下:
eclipse -console
保存后双击运行该批处理即可以看到OSGI的命令提示符,然后就可以通过命令来查看各个bundle的基本信息和状态了,可以通过ss来查看指定的bundle是否已经启动了,从而来判断component是否被激活:)