OSGi 模块的start level

读到这篇文章,说明你已经知道OSGi是什么,很可能也知道 OSGi 模块和软件工程中其他功能性单元一样,有它自己的生命周期。

OSGi的start level简单来说就是一个数字,用来定义模块的优先级,告诉负责OSGi 生命周期的容器 (Equinox Container),某个特定的模块应该在什么时候被启动。这个数字越小,代表模块的优先级越高。只有所有高优先级的模块都被完全执行后,才会开始执行低优先级的模块。

在整个容器启动的时候,会扫描所有模块的start level,然后从数字最小(优先级最高)的模块开始执行。具有相同start level的模块的执行顺序是不可控制的,在Equinox中默认的模块start level是4。

在Eclipse的Run Configuration --> OSGi Framework里面,默认的start level都是default,也就是4。

OSGi 模块的start level_第1张图片

大家不知道的是,Eclipse 3.5 以前的OSGi Framework run config 不是这样的,以前没有给模块设置start level的选项。之所以这样是因为Eclipse SDK中引入了OSGi Declarative Service (DS)。一个OSGi模块,只有在处于ACTIVE状态的时候才是可用的。怎么确保提供服务的模块在使用服务的模块之前被启动,怎么确保最基本的模块最先被启动,因为同一个模块在不同的runtime环境中,对于start level的要求很可能不一样,所以Eclipse意识到必须把设置start level的自由开放给程序员。

总的来说,程序员不需要过度考虑start level的问题,尤其是compile time的时候不需要考虑,只有在runtime的时候,在下面这个例子中,要注意一下即可。


当我们在做RCP开发时,都是在product文件进行runtime(以及发布)的一些设置,打开product文件,在Configuration页面可以看到设置start level (specify custom start levels for plug-ins)的地方。如果不进行设置,很可能会出现下面的问题

  1. Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini)
  2. java.lang.NullPointerException at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.<init> (ModelServiceImpl.java:92)
1、解决办法是把org.eclipse.core.runtime的start level设置为1(或者其他小于4的数),把auto-start设置为true

2、解决办法是把org.eclipse.equinox.ds和org.eclipse.equinox.event的start level设置为1(或者其他小于4的数),把auto-start设置为true


OSGi 模块的start level_第2张图片








你可能感兴趣的:(OSGi 模块的start level)