在上文中講到,Equinox包括核心框架,標(biāo)準(zhǔn)服務(wù)實(shí)現(xiàn),面向J2EE的應(yīng)用,新的部署更新框架及一些其他的研究方向。本文主要針對(duì)Equinox實(shí)現(xiàn)的OSGi核心框架及Equinox OSGi運(yùn)行環(huán)境的搭建過程進(jìn)行詳細(xì)講述。
用戶在閱讀下文時(shí),應(yīng)具有基本的Java編程及打包的概念并對(duì)OSGi標(biāo)準(zhǔn)的構(gòu)成有一定的了解,理解OSGi框架及Bundle的概念。
2、OSGi核心框架
從OSGi核心框架示意圖可以看到,OSGi核心框架主要包括模塊層,生命周期層,服務(wù)層及安全層組成。完整的OSGi核心框架實(shí)現(xiàn),還包括包管理服務(wù)(Package Admin)、啟動(dòng)層次服務(wù)(Start Level)、條件許可管理(Conditional Permission Admin)、權(quán)限管理(Permission Admin)及URL處理服務(wù)(URL Handlers)等框架服務(wù)。
關(guān)于OSGi核心框架的詳細(xì)介紹請(qǐng)參考OSGi標(biāo)準(zhǔn)規(guī)范。
3、Equinox的OSGi Framework實(shí)現(xiàn)
Equinox的OSGi框架實(shí)現(xiàn)包含在org.eclipse.osgi插件項(xiàng)目中。在發(fā)布的Eclipse環(huán)境中,用戶可以在Eclipse安裝目錄下的plugins目錄中找到該插件。該插件一般以 "org.eclipse.osgi_<版本號(hào)>.jar"的JAR文件形式打包。由于是從Eclipse3.0以前版本遷移到OSGi核心的緣故,目前的Equinox OSGi 實(shí)現(xiàn)中包含的代碼非常繁雜。
在org.eclipse.osgi項(xiàng)目源代碼中用戶可以看到除了OSGi接口及框架實(shí)現(xiàn)外,還包括adaptor接口及默認(rèn)的adaptor (defaultAdaptor),eclipse adaptor(eclipseAdaptor)實(shí)現(xiàn),控制臺(tái)實(shí)現(xiàn)(console),附加服務(wù)擴(kuò)展(supplement),Bundle組件解析 (resolver)和Bundle JAR文件校驗(yàn)等功能。
在實(shí)際使用中,用戶使用該Jar文件即可將OSGi框架運(yùn)行起來(參考下文OSGi運(yùn)行環(huán)境的搭建)。作為一個(gè)產(chǎn)品級(jí)的應(yīng)用,往往存在很多系統(tǒng)級(jí)的參數(shù)可供用戶進(jìn)行配置以調(diào)整系統(tǒng)的運(yùn)行行為而滿足不同環(huán)境的要求。同樣,Equinox運(yùn)行環(huán)境也提供了大量的運(yùn)行參數(shù)以供用戶選擇配置。配置Equinox運(yùn)行環(huán)境參數(shù)的方式主要有兩種,一種是使用JVM環(huán)境變量;另一種方式是使用Equinox的配置文件(config.ini)。
用戶在獲取到org.eclipse.osgi_<版本號(hào)>.jar文件后,可以嘗試以命令行的方式啟動(dòng)該Jar文件。該Jar文件的入庫主類是:org.eclipse.core.runtime.adaptor.EclipseStarter。
java -jar org.eclipse.osgi_3.3.1.R33x_v20070828.jar
用戶會(huì)發(fā)現(xiàn)該程序執(zhí)行后立即退出,控制臺(tái)上沒有任何輸出。這是因?yàn)椴淮嬖趽碛锌沙掷m(xù)運(yùn)行的代碼功能,框架啟動(dòng)后即退出主線程。下文中,我們會(huì)給出OSGi運(yùn)行環(huán)境搭建的詳細(xì)過程。
4、搭建Equinox OSGi運(yùn)行環(huán)境
4.1 原始的OSGi環(huán)境
從Eclipse官方網(wǎng)站下載Equinox OSGi框架。將其下載到c:\equinox目錄中。本文中使用的Equinox版本為3.3.1。直接從命令行運(yùn)行該jar文件時(shí)程序執(zhí)行后會(huì)立即退出,為了更好的了解Equinox OSGi框架的特點(diǎn),我們?cè)谶\(yùn)行時(shí)添加JVM參數(shù)"osgi.console"。如下圖所示:
執(zhí)行"java -Dosgi.console -jar org.eclipse.osgi_3.3.1_R33x_v20070828.jar" 后,系統(tǒng)給出"osgi>"命令輸入提示。輸入"ss"命令后回車,用戶可以看到上圖所示"Framework is launched."的信息。同時(shí),下方顯式了系統(tǒng)啟動(dòng)的Bundle列表,id列為該Bundle在OSGi運(yùn)行環(huán)境中的唯一運(yùn)行標(biāo)識(shí),State列為該Bundle當(dāng)前的狀態(tài),Bundle列顯示了該Bundle組件的SymbolicName。
此時(shí),OSGi框架已經(jīng)處于運(yùn)行狀態(tài)。
Equinox OSGi Console提供了很多命令用于與OSGi框架交互,用戶可以輸入任何非OSGi Console的內(nèi)部命令字符,控制太將顯示Equinox Console提供的所有命令。如下下圖所示:
執(zhí)行"services"命令,用戶可以看到當(dāng)前OSGi框架中發(fā)布的所有的服務(wù)信息。
4.2 以運(yùn)行參數(shù)方式向OSGi環(huán)境中部署B(yǎng)undle
下載Equinox SDK,將plugins目錄下的org.eclipse.osgi.services_3.1.200.v20070605.jar文件拷貝到C:\equinox目錄下。修改命令行運(yùn)行參數(shù)如下:
java -Dosgi.console -Dosgi.bundles=org.eclipse.osgi.services_3.1.200.v20070605.jar -jar org.eclipse.osgi_3.3.1_R33x_v20070828.jar
執(zhí)行該命令,系統(tǒng)運(yùn)行結(jié)果如下圖所示:
從運(yùn)行結(jié)果可以看出,JVM參數(shù)"-Dosgi.bundles= org.eclipse.osgi.services_3.1.200.v20070605.jar"將 org.eclipse.osgi.services組件部署到了OSGi運(yùn)行環(huán)境中。此時(shí),該組件的狀態(tài)為"RESOLVED",即該組件被框架解析但沒有啟動(dòng)。如果用戶希望組件在加載的同時(shí)啟動(dòng)該組件,可以修改上述參數(shù)為:
-Dosgi.bundles=org.eclipse.osgi.services_3.1.200.v20070605.jar@2:start。
"@2"指明該組件的啟動(dòng)級(jí)別,":"后的"start"標(biāo)明該組件在加載后啟動(dòng)。按修改后的參數(shù)重新執(zhí)行命令輸出結(jié)果如下圖所示:
從上圖可以看出,部署的org.eclipse.osgi.services組件在加載后被OSGi框架啟動(dòng),其狀態(tài)顯示為"ACTIVE"。
4.3以配置文件方式向OSGi環(huán)境中部署B(yǎng)undle
從上述部署B(yǎng)undle的方式看出,當(dāng)部署多個(gè)Bundle時(shí),使用JVM參數(shù)配置方式是不可取的。Equinox OSGi支持從配置文件中讀取加載的Bundle,下面我們演示如何使用配置文件部署多個(gè)Bundle。
將Equinox SDK中plugins目錄下的org.eclipse.osgi.util_3.1.200.v20070605.jar文件拷貝到C:\equinox目錄下。
Equinox OSGi提供了環(huán)境變量"osgi.configuration.area",該變量指明了配置文件config.ini的存儲(chǔ)路徑。下面我們?cè)贑:\equinox目錄下添加config.ini文件,并在該文件中添加如下內(nèi)容:
osgi.bundles=org.eclipse.osgi.services_3.1.200.v20070605.jar@2:start, org.eclipse.osgi.util_3.1.200.v20070605.jar
修改OSGi框架啟動(dòng)命令行為:
java -Dosgi.console -Dosgi.configuration.area=. -jar org.eclipse.osgi_3.3.1_R33x_v20070828.jar
執(zhí)行上述命令后的輸出結(jié)果如下圖所示:
5、使用Eclipse Launcher啟動(dòng)Equinox OSGi
熟悉Eclipse IDE環(huán)境的用戶會(huì)注意到3.2版本(包括3.2)以前Eclipse安裝目錄下存在eclipse.exe和startup.jar兩個(gè)文件,用于啟動(dòng) Eclipse運(yùn)行環(huán)境。從3.3版本開始,Equinox將startup.jar拆分為兩個(gè)不同的Bundle(Fragment)放置在了 plugins目錄下。用戶可以從Equinox站點(diǎn)下載Launcher。下載后的3.3.1發(fā)布版本的Launcher包括下面兩個(gè)組件:
org.eclipse.equinox.launcher_1.0.1.R33x_v20070828.jar
org.eclipse.equinox.launcher.win32.win32.x86_1.0.1.R33x_v20070828 [目錄]
在進(jìn)行下述操作之前,我們需要調(diào)整C:\equinox的目錄結(jié)構(gòu),在該目錄下添加"configuration"和"plugins"兩個(gè)目錄,將所有的Bundle組件(包括目錄)轉(zhuǎn)移到plugins目錄下;將config.ini文件轉(zhuǎn)移到configuration目錄下,將Launcher包中的"eclipse.exe"文件拷貝到C:\equinox目錄下。此時(shí)的目錄結(jié)構(gòu)如下圖所示:
plugins目錄下的內(nèi)容如下圖所示:
修改命令行OSGi框架啟動(dòng)命令為:
eclipse.exe -console -noexit
執(zhí)行該命令后,在彈出的控制臺(tái)中輸入"ss"命令,輸出結(jié)果如下:
5.1使用eclipse.ini文件
除了從命令行傳入eclipse.exe使用的運(yùn)行參數(shù)外,用戶也可以配置與eclipse.exe的文件同名的ini文件存放eclipse.exe運(yùn)行所需要的參數(shù)。用戶應(yīng)將該ini文件放置在eclipse.exe所在的文件目錄下。
我們?cè)贑:\equinox目錄下添加eclipse.ini文件,在該文件中添加如下內(nèi)容:
-console
-noexit
直接點(diǎn)擊eclipse.exe程序圖標(biāo)啟動(dòng)Equinox OSGi運(yùn)行環(huán)境。程序運(yùn)行結(jié)果如下圖所示:
至此,Equinox OSGi完整的運(yùn)行環(huán)境已經(jīng)搭建完成。如果用戶希望將新的Bundle發(fā)布到該環(huán)境中,只需要修改configuration目錄下config.ini文件,將新的bundle添加到osgi.bundles參數(shù)下。
6、常見問題
用戶在上述操作步驟中,會(huì)發(fā)現(xiàn)在configuration目錄下生成一些錯(cuò)誤日志文件,如果用戶發(fā)現(xiàn)日志中出現(xiàn)以下內(nèi)容:
java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:72)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:363)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:176)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:508)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:447)
at org.eclipse.equinox.launcher.Main.run(Main.java:1173)
用戶可以在config.ini文件中添加如下配置:
eclipse.ignoreApp=true
7、小結(jié)
在上文中,我們?cè)敿?xì)介紹了Equinox OSGi環(huán)境組成及其搭建過程。在下一篇文檔中,我們會(huì)對(duì)Equinox OSGi的運(yùn)行參數(shù)做詳細(xì)的介紹,同時(shí)提供一種方式使得OSGi框架能夠自動(dòng)發(fā)現(xiàn)部署的OSGi bundle而不用頻繁修改配置文件。
聯(lián)系客服