OSGi Bundle之Hello World

來源:互聯網
上載者:User

本文是《你
好,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

package com.javaworld.sample.helloworld;
importorg.osgi.framework.BundleActivator;
importorg.osgi.framework.BundleContext;
publicclass Activator implements BundleActivator {
  public void start(BundleContext context)throws Exception {
    System.out.println("Helloworld");
  }
  public void stop(BundleContext context)throws Exception {
    System.out.println("GoodbyeWorld");
  }
}

如果您想讓您開發的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檔案

Manifest-Version:1.0
Bundle-ManifestVersion:2
Bundle-Name:HelloWorld Plug-in
Bundle-SymbolicName:com.javaworld.sample.HelloWorld
Bundle-Version:1.0.0
Bundle-Activator:com.javaworld.sample.helloworld.Activator
Bundle-Vendor:JAVAWORLD
Bundle-Localization:plugin
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所示:


 

圖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)。


 

圖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的開發有了一個大致的瞭解。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.