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。


大家不知道的是,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










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章