1. 開發(fā)環(huán)境的準(zhǔn)備
現(xiàn)在的eclipse都已經(jīng)包含了Equinox,無需單獨(dú)下載。
2. 開發(fā)OSGi的HelloWorld應(yīng)用程序
在這一節(jié),我們將開發(fā)一個(gè)OSGi bundle,演示如何利用Equinox進(jìn)行OSGi bundle的開發(fā)、運(yùn)行及調(diào)試,為之后的示例做準(zhǔn)備。
首先,新建一個(gè)Plug-in工程,如下圖所示:

下一步,注意選擇目標(biāo)平臺(tái),默認(rèn)為Eclipse version *,將其改成Equinox,如下圖所示:
之后按默認(rèn)下一步即可,到最后一步時(shí),無需根據(jù)模板創(chuàng)建工程,去掉默認(rèn)的勾,如下圖:
點(diǎn)擊完成,創(chuàng)建的工程目錄如下圖所示:
從圖中,可以看到,eclipse為工程自動(dòng)生成了一個(gè)Activator類,如下所示:
package helloworld;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator
{

/**//*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/

public void start(BundleContext context) throws Exception
{
System.out.println("Hello World!");
}

/**//*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/

public void stop(BundleContext context) throws Exception
{
}
}
有過eclipse插件開發(fā)經(jīng)驗(yàn)的人應(yīng)該很快就能明白,這就是該工程——實(shí)際上就是上一篇文章中所稱的bundle在Equinox平臺(tái)中的啟動(dòng)入口,相當(dāng)于我們的熟悉的main函數(shù),如果將該bundle運(yùn)行到Equinox中,首先進(jìn)入該bundle的是Activator的start方法,你可以將相關(guān)的服務(wù)、資源在該方法內(nèi)完成向bundleContext的注冊(cè)——文章后面會(huì)具體講到相關(guān)內(nèi)容。在運(yùn)行期,如果想要該bundle停止運(yùn)行,Equinox平臺(tái)將調(diào)用Activator的stop方法,你可以在該方法內(nèi)完成資源的注銷等工作。
下面我們將要完成首次的Equinox運(yùn)行,將向大家展現(xiàn)bundle到底是如何運(yùn)行起來的。為helloworld選擇運(yùn)行方式,如下圖所示:

彈出如下對(duì)話框:
在彈出的對(duì)話框中,新建一個(gè)OSGi Framework運(yùn)行環(huán)境(雙擊OSGi Framework即可,這里為其取名Equinox),選中helloworld(1.0.0),然后點(diǎn)擊右邊的Add Required Bundles按鈕,eclipse將自動(dòng)選中運(yùn)行helloworld的依賴bundle,如果有必要,可以點(diǎn)擊右下的Validate Bundles驗(yàn)證按鈕,驗(yàn)證程序正常運(yùn)行所需的bundle是否都被選中,最后點(diǎn)擊運(yùn)行,回到控制臺(tái):
osgi> Hello World!
可以看到,之前在Activator的start方法中的輸出語句已經(jīng)被輸出到控制臺(tái),我們可以通過命令ss查看Equinox的運(yùn)行情況,可以看到一共運(yùn)行了兩個(gè)bundle,如下:
ss
Framework is launched.
id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.3.R34x_v20081215-1030
1 ACTIVE helloworld_1.0.0
還記得之前講到過的bundle的幾種狀態(tài)吧?helloworld已經(jīng)運(yùn)行起來了。
那么Equinox具體支持哪些命令呢?下表列出了主要的一些命令,如需查看更詳細(xì)的命令清單,則可以在控制臺(tái)鍵入help。
類別
|
命令
|
含義
|
控制框架
|
launch
|
啟動(dòng)框架
|
shutdown
|
停止框架
|
close
|
關(guān)閉、退出框架
|
exit
|
立即退出,相當(dāng)于 System.exit
|
init
|
卸載所有 bundle(前提是已經(jīng) shutdown)
|
setprop
|
設(shè)置屬性,在運(yùn)行時(shí)進(jìn)行
|
控制 bundle
|
install
|
安裝
|
uninstall
|
卸載
|
start
|
啟動(dòng)
|
stop
|
停止
|
refresh
|
刷新
|
update
|
更新
|
展示狀態(tài)
|
status
|
展示安裝的 bundle 和注冊(cè)的服務(wù)
|
ss
|
展示所有 bundle 的簡單狀態(tài)
|
services
|
展示注冊(cè)服務(wù)的詳細(xì)信息
|
packages
|
展示導(dǎo)入、導(dǎo)出包的狀態(tài)
|
bundles
|
展示所有已經(jīng)安裝的 bundles 的狀態(tài)
|
headers
|
展示 bundles 的頭信息,即 MANIFEST.MF 中的內(nèi)容
|
log
|
展示 LOG 入口信息
|
其它
|
exec
|
在另外一個(gè)進(jìn)程中執(zhí)行一個(gè)命令(阻塞狀態(tài))
|
fork
|
和 EXEC 不同的是不會(huì)引起阻塞
|
gc
|
促使垃圾回收
|
getprop
|
得到屬性,或者某個(gè)屬性
|
控制啟動(dòng)級(jí)別
|
sl
|
得到某個(gè) bundle 或者整個(gè)框架的 start level 信息
|
setfwsl
|
設(shè)置框架的 start level
|
setbsl
|
設(shè)置 bundle 的 start level
|
setibsl
|
設(shè)置初始化 bundle 的 start level
|
至此,我們已經(jīng)成功的演示了helloworld,初步了解了OSGi的bundle是如何開發(fā)并運(yùn)行的。
posted on 2010-03-28 16:58
Dreava 閱讀(2205)
評(píng)論(0) 編輯 收藏 所屬分類:
OSGi