OSGi Bundle之Hello World
http://developer.51cto.com/art/200909/152209.htm
本文是《你好,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
如果您想讓您開發的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文件
我們來看看這個文件中使用的屬性頭:
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容器進行交互。
請注意,這些命令是OSGi規范中規定的,因此,您可以使用它們和任何OSGi容器交互。
讀到這里,希望您對OSGi Bundle的開發有了一個大致的了解。
?
?
=================
http://zhoufu24.iteye.com/blog/131787
幾種OSGI bundle的打包方法及注意事項
OSGImavenEclipse配置管理項目管理? 前言:我相信做基于OSGI框架開發的朋友,對于OSGI的基本單元Bundle應該并不陌生,平時的開發中,做得最多事情就是bundle的開發和打包了,打包其實屬于蠻重要的一個過程,為什么說他重要呢,其實打包的過程就是一個理清bundle依賴關系的過程,在對OSGI的學習和使用過程中,個人覺得最令人頭痛的就是bundle之間的依賴關系,而且我到現在為止還沒有找到一種比較好的工具能夠很好的管理OSGI環境中的各個bundle的依賴關系。不過現在公司也有開始考慮做一些類似phpadmin,mysqladmin這樣的基于web的管理工具來對bundle進行統一管理,在這之前,如何解決依賴關系,如何將bundle正確的打包出來并進行部署成了OSGI開發中的一個主要問題,而這篇文章中,我主要介紹目前我自己用過得幾種打包方式,總結下經驗,如果大家有更好的方法或者有不清楚的地方也可以提出來一起討論~第一種方法就是直接通過eclipse提供的export功能,來直接導出一個一個插件工程,這個過程,相信大家已經用的很熟悉了,直接eclipse給你的提示一步步來就可以了。
這里我只想稍微提幾個注意的問題,首先是在打包的時候注意把必要的資源文件給勾選上,像我有時就忘記勾選上一些OSGI service的配置文件,而導致service不能發布或者獲取。其次,檢查好你的項目自描述文件MANIFAST.MF里面的OSGI相關的配置信息是否都已經寫正確,該export和該import的包是否寫對,個人覺得OSGI最讓人頭疼的就是解決bundle之間的依賴關系,有時候OSGI環境一大,依賴關系變得復雜,導出包,引用包常常會容易混淆,所以對OSGI環境中的組件的依賴進行統一管理和限定,可以使bundle的依賴更加清晰,環境也易于管理,降低OSGI開發復雜度。最后,有時候在導出包的時候會碰到一些問題,比如bundle之間循環調用,多半還是由于Bundle之間的依賴發生了沖突的關系,檢查一下是否多個bundle是否導出了相同包,bundle的引入包是否正確等等。
第二種方法則是利用apache為maven2.0提供的一個專門來打OSGI包的felix(http://felix.apache.org/site/maven-osgi-plugin.html)插件來利用maven進行OSGI bundle的打包工作,felix這個插件在maven中的使用還是比較容易的。官方網站(http://cwiki.apache.org/FELIX/osgi-plugin-for-maven-2.html)上給出了一個比較詳盡的使用說明,這里我大致說明一下,只需要在項目的pom文件中配置一個plugin就ok了,最簡單的配置如下:<o:p></o:p>
xml 代碼當然,這種配置就是告訴maven在對你的項目進行打包的時候直接使用resources/manifest.mf文件進行打包了,除此之外,如果你并不想一開始就指定一個MANIFAST.MF文件,而是將這個工作在打包過程交給felix去完成的話,那么你可以為MANIFAST.MF文件配置一些必要的屬性,然后felix會根據這個屬性來生成一個MANIFAST.MF一起打包到項目中,如:<o:p></o:p>
xml 代碼顯然,從<osgimanifest></osgimanifest>標簽開始,你就是在手動的寫一個MANIFAST.MF文件的相關OSGI配置信息了,此外你還可以加上一些打包配置來將指定的資源文件進行打包,如:
在<osgimanifest></osgimanifest>標簽以內加入如下的設定
<_include>
?????? -target/classes/META-INF/details.bnd
<!---->
<_classpath>target/classes<!---->
第一種是告訴maven將一個指定文件打包
第二種是設定編譯后類文件的存放位置
<o:p>?</o:p>
這里提供一個實際運用的簡要配置模板實例,大家可以稍作修改就可以直接使用了:
xml 代碼以上僅是我在實際項目中打包時候的設置過得一個樣例,僅供大家參考,大家可以根據實際項目信息來自行設置自己的項目描述。具體的其他OSGI相關配置所應對應設定什么樣的標簽的內容,請參考apache官網(http://cwiki.apache.org/FELIX/osgi-plugin-for-maven-2.html)提供的參考。
配置完畢后,在當前項目目錄下,運行maven的package命令,就能得到一個由你自己自配置的一個OSGI bundle了。
第三種方式:
利用OPS4J組織提供的一個叫Pax的工具來進行OSGI bunder的構建. 這里需要說的就是,我什么要用PAX來構建一個OSGI工程呢,eclipse不是已經有很好的OSGI開發支持了么,這里要說的就是,PAX構建的OSGI工程并不是單單某個OSGI bundle的開發,而是,PAX會主動的為你創建一個基本的OSGI環境,這個環境包括一些OSGI的基礎包,你可以通過PAX的命令來啟動這個OSGI環境,同時PAX也會將其管理的一些Bundle進行打包實時發布到這個環境中,這樣不但可以按需的打包bundle,還可以迅速的構建一個OSGI環境來進行調試了。這里我簡要的說一下PAX的使用方法,PAX是一個專門用來構建和管理OSGI 環境的一個工具,從官網的介紹我們可以看到,他主要提供pax-create-project pax-add-repository pax-create-bundle pax-import-bundle pax-embed-jar pax-wrap-jar pax-move-bundle pax-remove-bundle? 等幾大腳本命令來,完成一些兒OSGI環境的構建工作。這里我只簡要介紹一下我平時幾條最常用的命令,通過這些命令的介紹來大概的給大家講解一下pax的使用方式。首先從官方down到pax的最新包
Down好后,進行解壓,解壓完畢后,為了在命令行中使用,你需要將其中的bin目錄設置到環境變量PATH中,設置完畢后你就可以到你希望創建項目的目錄,利用PAX提供的第一條命令pax-create-project來創建一個OSGI工程。創建好這個工程后,我們就可以利用maven的命令來啟動這個OSGI的環境工程,pax會為幫我們構建一個基礎OSGI環境,以及將test工程中的bundle工程打成bundle部署到這個環境中去,當然我們現在還為在這個工程中創建任何bundle工程,所以,我們啟動的只是一個最小的OSGI環境。
<o:p>?</o:p>
接下來我們在這個PAX的工程中來創建我們bundle工程,pax提供四種命令來創建bundle的打包工程pax-create-bundle pax-import-bundle pax-embed-jar pax-wrap-jar
pax-create-bundle是完全用pax創建一個符合OSGI規范bundle項目,最后在執行mvn clean install pax:provision 命令時,pax會把這個工程打成一個bundle然后部署到它的OSGI環境中去。
pax-import-bundle 則是直接導入一個符合OSGI規范的bundle,這樣在啟動OSGI環境的時候pax會去指定group(-g),指定的artifactId(-a)和指定的version(-v)的repository下去搜索指定的OSGI bundle并將其導入到環境中。
pax-wrap-jar 通過該命令則可以利用pax將一個jar包打包成一個符合OSGI規范的bundle,pax能夠對這個jar包進行分析,找出其中的依賴關系,并生成相關的MANIFAST.MF文件。再吧這個bundle部署到之前的OSGI環境中去。
在項目中我最常用的就是以上三條,其余的命令,以及這些命令的具體使用方法大家可以參考官方網站給出的示例。
接下來,我就利用pax-create-bundle命令來創建一個bundle工程,來給大家演示一下。
先選擇到一個需要創建工程的目錄下
看看一個test工程生成了,可以看到pax實際上給我們生成了一些初始的pom,大家可以打開看看
接下來我們馬上來跑下這個工程。看看pax會給我們帶來什么效果
先進入到text目錄,大家可以打開pax生成的pom.xml看看,實際上pax是把自己作為了一個maven的插件來供maven調用,這里我們用maven來運行這個工程,命令是mvn clean install pax:provision
<o:p>?</o:p>
可以看到pax為我們啟動了一個OSGI運行環境,我們用ss命令來查看但前環境中的bundle信息
呵呵,果然是一個最小的OSGI環境。
接下來我輸入命令來創建一個bundle工程:
pax-create-bundle -g com.zhoufu.demo -a create_bundle_demo -v 1.0,接下來看看pax會為我們產生什么
可以看到在test環境工程下,pax為我們創建了一個符合OSGI規范的create_bundle_demo工程
<o:p>?</o:p>
接下來我們就可以直接對這個工程進行maven(mvn eclipse:eclipse)使其成為一個eclipse可以識別的工程,來用eclipse對其進行開發了。
當開發完畢后,我們就可以直接利用之前的pax:provision命令來啟動這個環境的工程,pax會依次由test目錄下的pom來檢索相應的bundle工程,按照各個bundle中pom的配置對其進行OSGI的bundle打包工作,打成bundle后再將其部署到啟動的OSGI環境中去。
現在,我們看看我們剛才生成的那個工程里的POM文件
xml 代碼非常好,當然,這只是個初始的POM,隨著bundle的開發,這里面肯定有一些關于bundle的依賴配置,需要增加到MANIFAST.MF文件中去,那么怎么告訴pax打包的時候生成什么樣的MANIFAST.MF文件呢,其實也就是在org.ops4j.pax.maven這個plugin的配置段里進行配置好了。如下,我從項目中,提取了一段配置的模板,大家可以參考參考
xml 代碼
看見了吧,其實這個跟之前的利用maven插件來打包的方式很相似,也是把配置寫到pom之中,再由插件去進行打包,只不過這里用的插件是pax。
<o:p>?</o:p>
假設我們的bundle開發好了,我們再把之前的那個test工程跑一下看看
在test目錄下敲mvn clean install pax:provision命令。看看結果<o:p></o:p>
<u1:p>?</u1:p><o:p></o:p>
看見沒,在我們原來的環境中多了一個新建的這個
?
?
總結
以上是生活随笔為你收集整理的OSGi Bundle之Hello World的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: build-helper-maven-p
- 下一篇: ServiceMix中部署:OSGi B