從代碼角度來看,Equinox其實就是OSGi核心標準的完整實現,而且還在這個基礎上增長了一些額外的功能(好比爲框架增長了命令行和程序執行的入口)。咱們在以前入門篇講解的都東西其實都是OSGi核心標準的一小部分。其實它的核心就是一個jar包,這個jar包既能執行(做爲標準Java包的特性),也是一個bundle(Manifest裏面含有OSGi bundle特有的元數據)。
咱們可以利用Equinox項目的代碼來運行一個實實在在的OSGi框架,框架啓動後,你就能夠將你開發好bundle放到裏面運行。java
Equinox在http://download.eclipse.org/equinox上有官方下載,裏面列出了各個版本供咱們選擇:web
在這裏,咱們使用3.7版本的Equinox,下載好之後放在一個單獨的文件夾下(這裏個人路徑是D:\develop-tools):框架
若是啓動這個框架的話,有了上面的jar包就足夠了,咱們進入命令行輸入以下命令:java –jar org.eclipse.osgi_3.7.2.v20120110-1415.jar -console ,而後就會進入Equinox的控制檯:eclipse
若是出現osgi>的提示符,就說明啓動成功了。
Equinox的控制檯的部分基本命令以下(區分大小寫):ui
install [URL] | 將URL表示的bundle安裝到框架中 |
uninstall [bundleID] | 將id=bundleID的bundle卸載 |
start [bundleID] | 啓動一個bundle |
stop [bundleID] | 中止一個bundle |
refresh [bundleID] | 刷新bundle |
update [bundleID] | 更新bundle 的內容 |
ss | 簡單顯示全部bundle的狀態 |
status | 展現安裝的bundle和註冊的服務 |
headers [bundleID] | 展現bundle 的manifest中的元數據 |
進入Eclipse的window-->preferences-->Plug-in Development-->Target Platform:spa
初始狀態只有一個Runing Platform, 點擊「Add…」按鈕來增長一個咱們本身的的platform,進入以下界面:命令行
選擇默認的第一個就好,點擊next;code
再點擊這裏的「Add…」;orm
選擇Directory;對象
選擇你的Equinox的jar包所在的路徑,而後點擊finish,回到剛纔的界面:
這時候你就會發現裏面多出來了你剛剛設置的路徑,路徑後面描述的「1 plug-ins available」則就是說的咱們放置的Equinox的jar包。
繼續點擊finish,回到最開始的界面:
這時候多出來了一個新的target platform,勾選上,而後肯定。
打開菜單項Run->Run configurations…,在OSGi Framework項中,新建一個Run configuration:
點擊run按鈕
Eclipse的控制檯中也出現來了osgi的提示符,說明你已經成功啓動了。
你能夠試試剛纔講的那些命令,看看能輸出些什麼(好比上圖中我輸入了ss)。
打開新建project的界面,選擇Plug-in Project:
而後輸入project的名字,TargetPlatform處選擇an OSGi framework->Equinox或者standard都行,點擊下一步:
這裏其實是對bundle的Manifest文件的設置,其中的ID就是Bundle-SymbolicName,Version就是bundle的版本號,下面還能決定是否認義BundleActivator,點擊finish就建立了一個project:
至此,開發環境已經創建完畢(這個project只是爲了演示怎麼創建,不會在接下來的內容中用到,可刪之)。
如今可謂是萬事具有,只欠Helloworld了。爲了將OSGi框架的三個層次都涵蓋到,這個Helloworld可能會比其餘你見到的OSGi Helloworld程序要複雜一點點。若是對代碼中的一些API感到生疏,記得回到以前的入門篇中找到對應的內容,這樣對你理解代碼會有幫助。裏面的關鍵代碼已經用黃色高亮顯示。(出於篇幅考慮,代碼中的import語句都省略)
首先咱們建立一個工程HelloWorld,在這個工程裏面,咱們建立一個包含sayHello方法的接口,準備做爲服務接口:
而後,對這個接口進行實現:
了將這個接口暴露出來,咱們須要在MANIFEST文件中加入以下條目:
接下來,爲了把這個服務註冊到框架中,咱們定義了一個Activator:
爲這個HelloImpl傳入了"Hello, OSGi"的字符串 爲了讓這個Activator可以工做,須要在MANIFEST文件中作以下定義:
Bundle-Activator: com.yangw.helloworld.activator.Activator
建立一個工程HelloClient,建立一個叫HelloUser的BundleActivator,其中的start方法會得到接口爲Hello的服務對象,而且經過這個對象來調用sayHello方法:
爲了得到Hello這個接口的定義,咱們還須要在MANIFEST文件中import Hello所在的package:
下圖表示了這幾個類的各個功能的相互依賴關係,整個關係從Hello接口的定義開始;而後到Hello接口被實現,獲得HelloImpl;再到Activator將HelloImpl註冊爲框架中的一個服務,再到HelloUser經過與框架交互獲得剛纔註冊的服務,而且使用這個服務從而輸出字符串;最後一個可選流程是當咱們stop org.serc.helloworld這個bundle的時候,程序會將以前註冊的服務註銷掉。
經過上面的工做,咱們獲得了兩個本身定義的bundle: org.serc.helloworld org.serc.helloworld.client 如今打開Run configurations界面,咱們會看見Bundles標籤裏面多出來了這兩個bundle:
run 便可,使用ss,start stop等命令便可看到效果