程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> OSGi Bundle之Hello World

OSGi Bundle之Hello World

編輯:J2EE

本文是《你好,OSGi》系列的第二部分。之前曾介紹過OSGi是什麼,下面將繼續上篇介紹的內容,講述一個簡單的OSGi Bundle:Hello World是如何開發的。

51CTO編輯推薦:OSGi入門與實踐全攻略

開發一個簡單的Hello World的OSGi Bundle(OSGi綁定包)

在OSGi中,軟件是以Bundle的形式發布的。一個Bundle由Java類和其它資源構成,它可為其它的Bundle提供服務,也可以導入其它Bundle中的Java包;同時,OSGi的Bundle也可以為其所在的設備提供一些功能。Eclipse為開發OSGiBundle提供了優秀的支持,它不僅提供了向導來創建OSGi Bundle,而且還提供了內嵌的Equinox容器,您可以使用該容器執行和調試OSGi插件。請注意每一個Eclipse插件,從本質上說,都是一個OSGi Bundle,只是這個OSGiBundle多加了一些Eclipse專用的代碼而已。下面我們來看看如何使用Eclipse開發一個簡單的OSGi的HelloWorld Bundle。

3.1.新建Bundle

1) 在Eclipse中,點擊“File->New->Project”菜單,您將會看到新項目創建對話框;

2) 在新項目對話框中,選擇“Plug-inProject(插件項目)”並點擊“Next(下一步)”按鈕,您將看到插件項目對話框;

3) 在插件項目對話框中,請鍵入下列值:

Project Name(項目名稱):com.Javaworld.sample.HelloWorld

Target Platform(目標平台):an OSGiFramework->Standard (OSGi框架->標准)

4) 對其它的要求輸入值采用缺省值,並點擊“Next(下一步)”按鈕,您將會看到插件上下文對話框;

5) 在插件上下文對話框中,請選擇缺省值並點擊“Next(下一步)”按鈕;

6) 在模板對話框中,請選擇“Hello OSGiBundle(你好,OSGi包)”模板,然後點擊“Finish(完成)”按鈕完成該項目。

Eclipse將花幾秒鐘生成HelloWorld Bundle模板代碼,它將新建兩個文件:Activator.Java和MANIFEST.MF,下面,讓我們看看這兩個文件:

3.1.1. Activator.Java文件

源代碼清單1.Activator.Java

  1. package com.Javaworld.sample.helloworld;
  2. importorg.osgi.framework.BundleActivator;
  3. importorg.osgi.framework.BundleContext;
  4. publicclass Activator implements BundleActivator {
  5. public void start(BundleContext context)throws Exception {
  6. System.out.println("Helloworld");
  7. }
  8. public void stop(BundleContext context)throws Exception {
  9. System.out.println("GoodbyeWorld");
  10. }
  11. }

如果您想讓您開發的Bundle能在其啟動或關閉時通知自身,那麼您應新建一個類,讓它實現BundleActivator接口,同時,您還需要遵行下列規則:

這個實現了BundleActivator接口的類必須有一個public的、不帶參數的構造函數,這樣,OSGi框架就能調用該類的Class.newInstance()方法創建這個BundleActivator對象;

容器將調用Activator類的start()方法來啟動Bundle,因此,我們可以在start()方法中執行一些資源初始化的操作,例如,我們可以在該方法中獲取數據庫連接,以備後用。這個start()方法的唯一參數是一個BundleObject對象,Bundles可以通過該對象和OSGi框架通訊,我們可以從該對象中獲取OSGi容器相關的一些信息;如果某個Bundle拋出異常,容器將之置為“stopped(已停止)”狀態,此時,這個Bundle就不能對外提供服務。

如果我們要關閉一個Bundle,容器將調用Activator類中的stop()方法。因此,我們可在stop()方法中執行一些資源清理任務,比如釋放數據庫連接。

一旦Activator類准備就緒,您就可以通過MANIFEST.MF文件把該包的合法名稱傳給容器。下面,我們就看看這個MANIFEST.MF文件。

3.1.2. MANIFEST.MF文件

該文件是Bundle的部署描述文件,其格式和正常JAR文件包中的MANIFEST.MF文件相同,因此它由一系列的屬性及這些屬性對應的值組成,屬性名位於每一行的開頭,我們可以稱其為屬性頭。OSGi規范規定,您可以使用屬性頭向容器描述您的Bundle。您的HelloWorld Bundle的MANIFEST.MF文件看起來應該如清單2所示:

源代碼清單2. Hello World Bundle中的MANIFEST.MF文件

  1. Manifest-Version:1.0
  2. Bundle-ManifestVersion:2
  3. Bundle-Name:HelloWorld Plug-in
  4. Bundle-SymbolicName:com.Javaworld.sample.HelloWorld
  5. Bundle-Version:1.0.0
  6. Bundle-Activator:com.Javaworld.sample.helloworld.Activator
  7. Bundle-Vendor:JavaWORLD
  8. Bundle-Localization:plugin
  9. Import-Package:org.osgi.framework;version="1.3.0"

我們來看看這個文件中使用的屬性頭:

Bundle-ManifestVersion

該屬性頭告訴OSGi容器,本Bundle將遵循OSGi規范,數值2表示本Bundle和OSGi規范第4版本兼容;如果該屬性的數值為1,那麼則表示本包和OSGi版本3或更早版本兼容。

Bundle-Name

該屬性頭為本Bundle定義了一個簡短的、可以閱讀的名稱;

Bundle-SymbolicName

這個屬性頭為本Bundle定義了一個唯一的、非本地化的名字;當您需要從別的Bundles中訪問某一指定的Bundle時,您就要使用這個名字。

Bundle-Version

該屬性頭給出了本Bundle的版本號。

Bundle-Activator

該屬性頭給出了本Bundle中使用的監聽器類名字,這個屬性值是可選的。監聽器將對Activator中的start()和stop()方法監聽。在程序清單2中,該屬性頭的值為com.Javaworld.sample.helloworld.Activator。

Bundle-Vendor

該屬性頭是對本Bundle發行商的表述。

Bundle-Localization

該屬性頭包含了本Bundle的本地化文件所在的位置,我們的HelloWorld Bundle中並沒有本地化文件,但Eclipse IDE仍自動產生這個屬性頭

Import-Package

該屬性頭定義了本Bundle中引入的Java包,我將在本文後面的依賴性管理小節中詳細講解這個問題。現在,HelloWorld Bundle已經准備就緒,讓我們來運行並看看它的輸出結果。

3.2. 運行Bundle

我在前面提到,Eclipse IDE中有一個內嵌的EquinoxOSGi容器,您可以利用它來執行或調試OSGi Bundle。請按照下面步驟執行剛才的HelloWorld Bundle:

1 ) 單擊RunàRun… 菜單(譯者注,在Eclipse3.3中,請單擊RunàOpen Run Diglog…菜單);

2) Eclipse會打開“Create,manage and run configuration(新建、管理和運行配置)”對話框,請雙擊”EquinoxOSGi Framework”按鈕,Eclipse將打開運行時配置對話框;

3) 在上面的對話框中,將Name(名稱)輸入框的值改為HelloWorld Bundle;

4) 您會注意到在Workspace插件目錄下,有一個名為com.Javaworld.sample.HelloWorld的插件,請選中它;在TargetPlatform(目標平台)下,請確保org.eclipse.osgi插件被選中。您的Run(運行)對話框應該看起來如圖1所示:

HelloWorld Bundle的運行配置

圖1. HelloWorld Bundle的運行配置

5) 現在,請單擊Run(運行)按鈕,您應該看到控制台視圖上打印出“HelloWorld”。其實,Eclipse是在控制台視圖中打開OSGi控制台。

3.2.1. OSGi控制台

OSGi控制台是OSGi容器的命令行界面,您可以在這個控制台上啟動、停止、安裝、更新和刪除Bundles。在EclipseIDE中,請點擊該控制台視圖獲得焦點,然後按回車鍵,這時您可以看到OSGi提示符,如圖2所示:(譯者注,在Eclipse3.3中,如果您沒有看到OSGi提示符,請在圖1的運行配置中,點擊Arguments標簽,然後在ProgramArguments(程序參數)輸入框中鍵入“-console”,然後再次運行該Bundle)。

OSGi控制台和HelloWorldActivator.java

圖2. OSGi控制台和HelloWorldActivator.Java

下面是幾個經常使用的OSGi命令,您可以使用這些命令與OSGi容器進行交互。

  1. ss: 該命令顯示所有已安裝的Bundles及它們的狀態,它將顯示Bundle ID,Bundle的簡短名稱及Bundle狀態;
  2. start< bundleid>: 該命令將啟動一個Bundle;
  3. stop< bundleid>: 該命令將停止一個Bundle;
  4. update< bundleid>: 該命令使用新的JAR文件更新一個Bundle;
  5. install< bundleid>: 該命令將一個新的Bundle安裝到OSGi容器;
  6. uninstall< bundleid>: 從OSGi容器中卸載一個已安裝的Bundle。

請注意,這些命令是OSGi規范中規定的,因此,您可以使用它們和任何OSGi容器交互。

讀到這裡,希望您對OSGi Bundle的開發有了一個大致的了解。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved