日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

OSGi Bundle之Hello World

發(fā)布時(shí)間:2024/4/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OSGi Bundle之Hello World 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://developer.51cto.com/art/200909/152209.htm

本文是《你好,OSGi》系列的第二部分。之前曾介紹過(guò)OSGi是什么,下面將繼續(xù)上篇介紹的內(nèi)容,講述一個(gè)簡(jiǎn)單的OSGi Bundle:Hello World是如何開發(fā)的。

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

開發(fā)一個(gè)簡(jiǎn)單的Hello World的OSGi Bundle(OSGi綁定包)

在OSGi中,軟件是以Bundle的形式發(fā)布的。一個(gè)Bundle由Java類和其它資源構(gòu)成,它可為其它的Bundle提供服務(wù),也可以導(dǎo)入其它Bundle中的Java包;同時(shí),OSGi的Bundle也可以為其所在的設(shè)備提供一些功能。Eclipse為開發(fā)OSGiBundle提供了優(yōu)秀的支持,它不僅提供了向?qū)?lái)創(chuàng)建OSGi Bundle,而且還提供了內(nèi)嵌的Equinox容器,您可以使用該容器執(zhí)行和調(diào)試OSGi插件。請(qǐng)注意每一個(gè)Eclipse插件,從本質(zhì)上說(shuō),都是一個(gè)OSGi Bundle,只是這個(gè)OSGiBundle多加了一些Eclipse專用的代碼而已。下面我們來(lái)看看如何使用Eclipse開發(fā)一個(gè)簡(jiǎn)單的OSGi的HelloWorld Bundle。

3.1.新建Bundle

1) 在Eclipse中,點(diǎn)擊“File->New->Project”菜單,您將會(huì)看到新項(xiàng)目創(chuàng)建對(duì)話框;

2) 在新項(xiàng)目對(duì)話框中,選擇“Plug-inProject(插件項(xiàng)目)”并點(diǎn)擊“Next(下一步)”按鈕,您將看到插件項(xiàng)目對(duì)話框;

3) 在插件項(xiàng)目對(duì)話框中,請(qǐng)鍵入下列值:

Project Name(項(xiàng)目名稱):com.javaworld.sample.HelloWorld

Target Platform(目標(biāo)平臺(tái)):an OSGiFramework->Standard (OSGi框架->標(biāo)準(zhǔn))

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

5) 在插件上下文對(duì)話框中,請(qǐng)選擇缺省值并點(diǎn)擊“Next(下一步)”按鈕;

6) 在模板對(duì)話框中,請(qǐng)選擇“Hello OSGiBundle(你好,OSGi包)”模板,然后點(diǎn)擊“Finish(完成)”按鈕完成該項(xiàng)目。

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

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"); ?
  • } ?
  • } ?
  • ?
  • 如果您想讓您開發(fā)的Bundle能在其啟動(dòng)或關(guān)閉時(shí)通知自身,那么您應(yīng)新建一個(gè)類,讓它實(shí)現(xiàn)BundleActivator接口,同時(shí),您還需要遵行下列規(guī)則:

    這個(gè)實(shí)現(xiàn)了BundleActivator接口的類必須有一個(gè)public的、不帶參數(shù)的構(gòu)造函數(shù),這樣,OSGi框架就能調(diào)用該類的Class.newInstance()方法創(chuàng)建這個(gè)BundleActivator對(duì)象;

    容器將調(diào)用Activator類的start()方法來(lái)啟動(dòng)Bundle,因此,我們可以在start()方法中執(zhí)行一些資源初始化的操作,例如,我們可以在該方法中獲取數(shù)據(jù)庫(kù)連接,以備后用。這個(gè)start()方法的唯一參數(shù)是一個(gè)BundleObject對(duì)象,Bundles可以通過(guò)該對(duì)象和OSGi框架通訊,我們可以從該對(duì)象中獲取OSGi容器相關(guān)的一些信息;如果某個(gè)Bundle拋出異常,容器將之置為“stopped(已停止)”狀態(tài),此時(shí),這個(gè)Bundle就不能對(duì)外提供服務(wù)。

    如果我們要關(guān)閉一個(gè)Bundle,容器將調(diào)用Activator類中的stop()方法。因此,我們可在stop()方法中執(zhí)行一些資源清理任務(wù),比如釋放數(shù)據(jù)庫(kù)連接。

    一旦Activator類準(zhǔn)備就緒,您就可以通過(guò)MANIFEST.MF文件把該包的合法名稱傳給容器。下面,我們就看看這個(gè)MANIFEST.MF文件。

    3.1.2. MANIFEST.MF文件

    該文件是Bundle的部署描述文件,其格式和正常JAR文件包中的MANIFEST.MF文件相同,因此它由一系列的屬性及這些屬性對(duì)應(yīng)的值組成,屬性名位于每一行的開頭,我們可以稱其為屬性頭。OSGi規(guī)范規(guī)定,您可以使用屬性頭向容器描述您的Bundle。您的HelloWorld Bundle的MANIFEST.MF文件看起來(lái)應(yīng)該如清單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"?
  • ?
  • 我們來(lái)看看這個(gè)文件中使用的屬性頭:

    Bundle-ManifestVersion

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

    Bundle-Name

    該屬性頭為本Bundle定義了一個(gè)簡(jiǎn)短的、可以閱讀的名稱;

    Bundle-SymbolicName

    這個(gè)屬性頭為本Bundle定義了一個(gè)唯一的、非本地化的名字;當(dāng)您需要從別的Bundles中訪問(wèn)某一指定的Bundle時(shí),您就要使用這個(gè)名字。

    Bundle-Version

    該屬性頭給出了本Bundle的版本號(hào)。

    Bundle-Activator

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

    Bundle-Vendor

    該屬性頭是對(duì)本Bundle發(fā)行商的表述。

    Bundle-Localization

    該屬性頭包含了本Bundle的本地化文件所在的位置,我們的HelloWorld Bundle中并沒有本地化文件,但Eclipse IDE仍自動(dòng)產(chǎn)生這個(gè)屬性頭

    Import-Package

    該屬性頭定義了本Bundle中引入的Java包,我將在本文后面的依賴性管理小節(jié)中詳細(xì)講解這個(gè)問(wèn)題。現(xiàn)在,HelloWorld Bundle已經(jīng)準(zhǔn)備就緒,讓我們來(lái)運(yùn)行并看看它的輸出結(jié)果。

    3.2. 運(yùn)行Bundle

    我在前面提到,Eclipse IDE中有一個(gè)內(nèi)嵌的EquinoxOSGi容器,您可以利用它來(lái)執(zhí)行或調(diào)試OSGi Bundle。請(qǐng)按照下面步驟執(zhí)行剛才的HelloWorld Bundle:

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

    2) Eclipse會(huì)打開“Create,manage and run configuration(新建、管理和運(yùn)行配置)”對(duì)話框,請(qǐng)雙擊”EquinoxOSGi Framework”按鈕,Eclipse將打開運(yùn)行時(shí)配置對(duì)話框;

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

    4) 您會(huì)注意到在Workspace插件目錄下,有一個(gè)名為com.javaworld.sample.HelloWorld的插件,請(qǐng)選中它;在TargetPlatform(目標(biāo)平臺(tái))下,請(qǐng)確保org.eclipse.osgi插件被選中。您的Run(運(yùn)行)對(duì)話框應(yīng)該看起來(lái)如圖1所示:

    ?

    圖1. HelloWorld Bundle的運(yùn)行配置

    5) 現(xiàn)在,請(qǐng)單擊Run(運(yùn)行)按鈕,您應(yīng)該看到控制臺(tái)視圖上打印出“HelloWorld”。其實(shí),Eclipse是在控制臺(tái)視圖中打開OSGi控制臺(tái)。

    3.2.1. OSGi控制臺(tái)

    OSGi控制臺(tái)是OSGi容器的命令行界面,您可以在這個(gè)控制臺(tái)上啟動(dòng)、停止、安裝、更新和刪除Bundles。在EclipseIDE中,請(qǐng)點(diǎn)擊該控制臺(tái)視圖獲得焦點(diǎn),然后按回車鍵,這時(shí)您可以看到OSGi提示符,如圖2所示:(譯者注,在Eclipse3.3中,如果您沒有看到OSGi提示符,請(qǐng)?jiān)趫D1的運(yùn)行配置中,點(diǎn)擊Arguments標(biāo)簽,然后在ProgramArguments(程序參數(shù))輸入框中鍵入“-console”,然后再次運(yùn)行該Bundle)。

    ?

    圖2. OSGi控制臺(tái)和HelloWorldActivator.java

    下面是幾個(gè)經(jīng)常使用的OSGi命令,您可以使用這些命令與OSGi容器進(jìn)行交互。

  • ss:?該命令顯示所有已安裝的Bundles及它們的狀態(tài),它將顯示Bundle?ID,Bundle的簡(jiǎn)短名稱及Bundle狀態(tài); ?
  • start<?bundleid>:?該命令將啟動(dòng)一個(gè)Bundle; ?
  • stop<?bundleid>:?該命令將停止一個(gè)Bundle; ?
  • update<?bundleid>:?該命令使用新的JAR文件更新一個(gè)Bundle; ?
  • install<?bundleid>:?該命令將一個(gè)新的Bundle安裝到OSGi容器; ?
  • uninstall<?bundleid>:?從OSGi容器中卸載一個(gè)已安裝的Bundle。 ??
  • 請(qǐng)注意,這些命令是OSGi規(guī)范中規(guī)定的,因此,您可以使用它們和任何OSGi容器交互。

    讀到這里,希望您對(duì)OSGi Bundle的開發(fā)有了一個(gè)大致的了解。

    ?

    ?

    =================

    http://zhoufu24.iteye.com/blog/131787

    幾種OSGI bundle的打包方法及注意事項(xiàng)

    OSGImavenEclipse配置管理項(xiàng)目管理? 前言:我相信做基于OSGI框架開發(fā)的朋友,對(duì)于OSGI的基本單元Bundle應(yīng)該并不陌生,平時(shí)的開發(fā)中,做得最多事情就是bundle的開發(fā)和打包了,打包其實(shí)屬于蠻重要的一個(gè)過(guò)程,為什么說(shuō)他重要呢,其實(shí)打包的過(guò)程就是一個(gè)理清bundle依賴關(guān)系的過(guò)程,在對(duì)OSGI的學(xué)習(xí)和使用過(guò)程中,個(gè)人覺得最令人頭痛的就是bundle之間的依賴關(guān)系,而且我到現(xiàn)在為止還沒有找到一種比較好的工具能夠很好的管理OSGI環(huán)境中的各個(gè)bundle的依賴關(guān)系。不過(guò)現(xiàn)在公司也有開始考慮做一些類似phpadmin,mysqladmin這樣的基于web的管理工具來(lái)對(duì)bundle進(jìn)行統(tǒng)一管理,在這之前,如何解決依賴關(guān)系,如何將bundle正確的打包出來(lái)并進(jìn)行部署成了OSGI開發(fā)中的一個(gè)主要問(wèn)題,而這篇文章中,我主要介紹目前我自己用過(guò)得幾種打包方式,總結(jié)下經(jīng)驗(yàn),如果大家有更好的方法或者有不清楚的地方也可以提出來(lái)一起討論~

    第一種方法就是直接通過(guò)eclipse提供的export功能,來(lái)直接導(dǎo)出一個(gè)一個(gè)插件工程,這個(gè)過(guò)程,相信大家已經(jīng)用的很熟悉了,直接eclipse給你的提示一步步來(lái)就可以了。


    這里我只想稍微提幾個(gè)注意的問(wèn)題,首先是在打包的時(shí)候注意把必要的資源文件給勾選上,像我有時(shí)就忘記勾選上一些OSGI service的配置文件,而導(dǎo)致service不能發(fā)布或者獲取。其次,檢查好你的項(xiàng)目自描述文件MANIFAST.MF里面的OSGI相關(guān)的配置信息是否都已經(jīng)寫正確,該export和該import的包是否寫對(duì),個(gè)人覺得OSGI最讓人頭疼的就是解決bundle之間的依賴關(guān)系,有時(shí)候OSGI環(huán)境一大,依賴關(guān)系變得復(fù)雜,導(dǎo)出包,引用包常常會(huì)容易混淆,所以對(duì)OSGI環(huán)境中的組件的依賴進(jìn)行統(tǒng)一管理和限定,可以使bundle的依賴更加清晰,環(huán)境也易于管理,降低OSGI開發(fā)復(fù)雜度。最后,有時(shí)候在導(dǎo)出包的時(shí)候會(huì)碰到一些問(wèn)題,比如bundle之間循環(huán)調(diào)用,多半還是由于Bundle之間的依賴發(fā)生了沖突的關(guān)系,檢查一下是否多個(gè)bundle是否導(dǎo)出了相同包,bundle的引入包是否正確等等。

    第二種方法則是利用apache為maven2.0提供的一個(gè)專門來(lái)打OSGI包的felix(http://felix.apache.org/site/maven-osgi-plugin.html)插件來(lái)利用maven進(jìn)行OSGI bundle的打包工作,felix這個(gè)插件在maven中的使用還是比較容易的。官方網(wǎng)站(http://cwiki.apache.org/FELIX/osgi-plugin-for-maven-2.html)上給出了一個(gè)比較詳盡的使用說(shuō)明,這里我大致說(shuō)明一下,只需要在項(xiàng)目的pom文件中配置一個(gè)plugin就ok了,最簡(jiǎn)單的配置如下:<o:p></o:p>

    xml 代碼
  • <plugins>??
  • ??<plugin>??
  • ????<groupId>org.apache.felix.plugins<!---->groupId>??
  • ????<artifactId>maven-osgi-plugin<!---->artifactId>??
  • ????<extensions>true<!---->extensions>??
  • ????<version>0.3.0<!---->version>??
  • ????<configuration>??
  • ??????<manifestFile>resources/manifest.mf<!---->manifestFile>??
  • ????<!---->configuration>??
  • ??<!---->plugin>??
  • <!---->plugins>??
  • 當(dāng)然,這種配置就是告訴maven在對(duì)你的項(xiàng)目進(jìn)行打包的時(shí)候直接使用resources/manifest.mf文件進(jìn)行打包了,除此之外,如果你并不想一開始就指定一個(gè)MANIFAST.MF文件,而是將這個(gè)工作在打包過(guò)程交給felix去完成的話,那么你可以為MANIFAST.MF文件配置一些必要的屬性,然后felix會(huì)根據(jù)這個(gè)屬性來(lái)生成一個(gè)MANIFAST.MF一起打包到項(xiàng)目中,如:<o:p></o:p>

    xml 代碼
  • <plugins>??
  • ??<plugin>??
  • ????<groupId>org.apache.felix.plugins<!---->groupId>??
  • ????<artifactId>maven-osgi-plugin<!---->artifactId>??
  • ????<extensions>true<!---->extensions>??
  • ????<version>0.3.0<!---->version>??
  • ????<configuration>??
  • ??????<osgiManifest>??
  • ????????<bundleName>My?OSGi?Application<!---->bundleName>??
  • ????????<bundleDescription>An?example?bundle?application<!---->bundleDescription>??
  • ????????<bundleActivator>org.safehaus.bundle.Activator<!---->bundleActivator>??
  • ????????<importPackage>org.osgi.service.log<!---->importPackage>??
  • ????????<bundleVendor>Safehaus<!---->bundleVendor>??
  • ??????<!---->osgiManifest>??
  • ????<!---->configuration>??
  • ??<!---->plugin>??
  • <!---->plugins>??

  • 顯然,從<osgimanifest></osgimanifest>標(biāo)簽開始,你就是在手動(dòng)的寫一個(gè)MANIFAST.MF文件的相關(guān)OSGI配置信息了,此外你還可以加上一些打包配置來(lái)將指定的資源文件進(jìn)行打包,如:

    在<osgimanifest></osgimanifest>標(biāo)簽以內(nèi)加入如下的設(shè)定

    <_include>

    ?????? -target/classes/META-INF/details.bnd

    <!---->

    <_classpath>target/classes<!---->

    第一種是告訴maven將一個(gè)指定文件打包

    第二種是設(shè)定編譯后類文件的存放位置

    <o:p>?</o:p>

    這里提供一個(gè)實(shí)際運(yùn)用的簡(jiǎn)要配置模板實(shí)例,大家可以稍作修改就可以直接使用了:

    xml 代碼
  • <plugin>??
  • ????<groupId>org.apache.felix<!---->groupId>??
  • ????<artifactId>maven-bundle-plugin<!---->artifactId>??
  • ????????<extensions>true<!---->extensions>??
  • ????????????<configuration>??
  • ????????????????<instructions>??
  • ????????????????????<Bundle-Version>??
  • ????????????????????????${project.version}??
  • ????????????????????<!---->Bundle-Version>??
  • ????????????????????<Bundle-SymbolicName>??
  • ???????????????????????$(replace;${project.artifactId};-;_);singleton:=true??
  • ????????????????????<!---->Bundle-SymbolicName>??
  • ????<!---->??
  • ????????????????????<_classpath>target/classes<!---->_classpath>??
  • ????????????????????<Export-Package>??
  • ???????????????????????com.yourcompany.artifactId.*;version="${project.version}"??
  • ????????????????????<!---->Export-Package>??
  • ????????????????????<Import-Package>??
  • ????????????????????????org.springframework.test;resolution:=optional,*??
  • ????????????????????<!---->Import-Package>??
  • ????????????????????<DynamicImport-Package>*<!---->DynamicImport-Package>??
  • ????????????????????????<!---->??
  • ????????????????????<_include>??
  • ????????????????????????-target/classes/META-INF/details.bnd??
  • ????????????????????<!---->_include>??
  • ????????????????????<Include-Resource>??
  • ????????????????????????<!---->??
  • ????????????????????????<!---->Include-Resource>??
  • ????????????????????<!---->instructions>??
  • ????????????????<!---->configuration>??
  • ????????????<!---->plugin>??
  • 以上僅是我在實(shí)際項(xiàng)目中打包時(shí)候的設(shè)置過(guò)得一個(gè)樣例,僅供大家參考,大家可以根據(jù)實(shí)際項(xiàng)目信息來(lái)自行設(shè)置自己的項(xiàng)目描述。具體的其他OSGI相關(guān)配置所應(yīng)對(duì)應(yīng)設(shè)定什么樣的標(biāo)簽的內(nèi)容,請(qǐng)參考apache官網(wǎng)(http://cwiki.apache.org/FELIX/osgi-plugin-for-maven-2.html)提供的參考。

    配置完畢后,在當(dāng)前項(xiàng)目目錄下,運(yùn)行maven的package命令,就能得到一個(gè)由你自己自配置的一個(gè)OSGI bundle了。

    第三種方式:

    利用OPS4J組織提供的一個(gè)叫Pax的工具來(lái)進(jìn)行OSGI bunder的構(gòu)建. 這里需要說(shuō)的就是,我什么要用PAX來(lái)構(gòu)建一個(gè)OSGI工程呢,eclipse不是已經(jīng)有很好的OSGI開發(fā)支持了么,這里要說(shuō)的就是,PAX構(gòu)建的OSGI工程并不是單單某個(gè)OSGI bundle的開發(fā),而是,PAX會(huì)主動(dòng)的為你創(chuàng)建一個(gè)基本的OSGI環(huán)境,這個(gè)環(huán)境包括一些OSGI的基礎(chǔ)包,你可以通過(guò)PAX的命令來(lái)啟動(dòng)這個(gè)OSGI環(huán)境,同時(shí)PAX也會(huì)將其管理的一些Bundle進(jìn)行打包實(shí)時(shí)發(fā)布到這個(gè)環(huán)境中,這樣不但可以按需的打包bundle,還可以迅速的構(gòu)建一個(gè)OSGI環(huán)境來(lái)進(jìn)行調(diào)試了。這里我簡(jiǎn)要的說(shuō)一下PAX的使用方法,PAX是一個(gè)專門用來(lái)構(gòu)建和管理OSGI 環(huán)境的一個(gè)工具,從官網(wǎng)的介紹我們可以看到,他主要提供pax-create-project pax-add-repository pax-create-bundle pax-import-bundle pax-embed-jar pax-wrap-jar pax-move-bundle pax-remove-bundle? 等幾大腳本命令來(lái),完成一些兒OSGI環(huán)境的構(gòu)建工作。這里我只簡(jiǎn)要介紹一下我平時(shí)幾條最常用的命令,通過(guò)這些命令的介紹來(lái)大概的給大家講解一下pax的使用方式。
    首先從官方down到pax的最新包

    Down好后,進(jìn)行解壓,解壓完畢后,為了在命令行中使用,你需要將其中的bin目錄設(shè)置到環(huán)境變量PATH中,設(shè)置完畢后你就可以到你希望創(chuàng)建項(xiàng)目的目錄,利用PAX提供的第一條命令pax-create-project來(lái)創(chuàng)建一個(gè)OSGI工程。創(chuàng)建好這個(gè)工程后,我們就可以利用maven的命令來(lái)啟動(dòng)這個(gè)OSGI的環(huán)境工程,pax會(huì)為幫我們構(gòu)建一個(gè)基礎(chǔ)OSGI環(huán)境,以及將test工程中的bundle工程打成bundle部署到這個(gè)環(huán)境中去,當(dāng)然我們現(xiàn)在還為在這個(gè)工程中創(chuàng)建任何bundle工程,所以,我們啟動(dòng)的只是一個(gè)最小的OSGI環(huán)境。

    <o:p>?</o:p>

    接下來(lái)我們?cè)谶@個(gè)PAX的工程中來(lái)創(chuàng)建我們bundle工程,pax提供四種命令來(lái)創(chuàng)建bundle的打包工程pax-create-bundle pax-import-bundle pax-embed-jar pax-wrap-jar

    pax-create-bundle是完全用pax創(chuàng)建一個(gè)符合OSGI規(guī)范bundle項(xiàng)目,最后在執(zhí)行mvn clean install pax:provision 命令時(shí),pax會(huì)把這個(gè)工程打成一個(gè)bundle然后部署到它的OSGI環(huán)境中去。

    pax-import-bundle 則是直接導(dǎo)入一個(gè)符合OSGI規(guī)范的bundle,這樣在啟動(dòng)OSGI環(huán)境的時(shí)候pax會(huì)去指定group(-g),指定的artifactId(-a)和指定的version(-v)的repository下去搜索指定的OSGI bundle并將其導(dǎo)入到環(huán)境中。

    pax-wrap-jar 通過(guò)該命令則可以利用pax將一個(gè)jar包打包成一個(gè)符合OSGI規(guī)范的bundle,pax能夠?qū)@個(gè)jar包進(jìn)行分析,找出其中的依賴關(guān)系,并生成相關(guān)的MANIFAST.MF文件。再吧這個(gè)bundle部署到之前的OSGI環(huán)境中去。

    在項(xiàng)目中我最常用的就是以上三條,其余的命令,以及這些命令的具體使用方法大家可以參考官方網(wǎng)站給出的示例。

    接下來(lái),我就利用pax-create-bundle命令來(lái)創(chuàng)建一個(gè)bundle工程,來(lái)給大家演示一下。

    先選擇到一個(gè)需要?jiǎng)?chuàng)建工程的目錄下

    看看一個(gè)test工程生成了,可以看到pax實(shí)際上給我們生成了一些初始的pom,大家可以打開看看

    接下來(lái)我們馬上來(lái)跑下這個(gè)工程。看看pax會(huì)給我們帶來(lái)什么效果


    先進(jìn)入到text目錄,大家可以打開pax生成的pom.xml看看,實(shí)際上pax是把自己作為了一個(gè)maven的插件來(lái)供maven調(diào)用,這里我們用maven來(lái)運(yùn)行這個(gè)工程,命令是mvn clean install pax:provision
    <o:p>?</o:p>


    可以看到pax為我們啟動(dòng)了一個(gè)OSGI運(yùn)行環(huán)境,我們用ss命令來(lái)查看但前環(huán)境中的bundle信息


    呵呵,果然是一個(gè)最小的OSGI環(huán)境。

    接下來(lái)我輸入命令來(lái)創(chuàng)建一個(gè)bundle工程:

    pax-create-bundle -g com.zhoufu.demo -a create_bundle_demo -v 1.0,接下來(lái)看看pax會(huì)為我們產(chǎn)生什么



    可以看到在test環(huán)境工程下,pax為我們創(chuàng)建了一個(gè)符合OSGI規(guī)范的create_bundle_demo工程


    <o:p>?</o:p>

    接下來(lái)我們就可以直接對(duì)這個(gè)工程進(jìn)行maven(mvn eclipse:eclipse)使其成為一個(gè)eclipse可以識(shí)別的工程,來(lái)用eclipse對(duì)其進(jìn)行開發(fā)了。

    當(dāng)開發(fā)完畢后,我們就可以直接利用之前的pax:provision命令來(lái)啟動(dòng)這個(gè)環(huán)境的工程,pax會(huì)依次由test目錄下的pom來(lái)檢索相應(yīng)的bundle工程,按照各個(gè)bundle中pom的配置對(duì)其進(jìn)行OSGI的bundle打包工作,打成bundle后再將其部署到啟動(dòng)的OSGI環(huán)境中去。

    現(xiàn)在,我們看看我們剛才生成的那個(gè)工程里的POM文件

    xml 代碼
  • xml?version='1.0'?encoding='UTF-8'??>??
  • <project?xmlns="http://maven.apache.org/POM/4.0.0"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/maven-v4_0_0.xsd">??
  • ??
  • ??<parent>??
  • ????<relativePath>../poms/compiled/<!---->relativePath>??
  • ????<groupId>org.ops4j.example.test.build<!---->groupId>??
  • ????<artifactId>compile-bundle<!---->artifactId>??
  • ????<version>0.1.0-SNAPSHOT<!---->version>??
  • ??<!---->parent>??
  • ??
  • ??<properties>??
  • ????<bundle.package>com.zhoufu.demo<!---->bundle.package>??
  • ??<!---->properties>??
  • ??
  • ??<modelVersion>4.0.0<!---->modelVersion>??
  • ??<groupId>org.ops4j.example.test.bundles<!---->groupId>??
  • ??<artifactId>create_bundle_demo<!---->artifactId>??
  • ??<version>1.0<!---->version>??
  • ??
  • ??<name>${project.artifactId}?[${bundle.package}]<!---->name>??
  • ??
  • ??<packaging>bundle<!---->packaging>??
  • ??
  • ??<build>??
  • ????<plugins>??
  • ??????<plugin>??
  • ????????<artifactId>maven-dependency-plugin<!---->artifactId>??
  • ??????<!---->plugin>??
  • ??????<plugin>??
  • ????????<groupId>org.ops4j.pax.maven<!---->groupId>??
  • ????????<artifactId>maven-bundle-plugin<!---->artifactId>??
  • ??????<!---->plugin>??
  • ??????<plugin>??
  • ????????<groupId>org.ops4j.pax.construct<!---->groupId>??
  • ????????<artifactId>maven-pax-plugin<!---->artifactId>??
  • ??????<!---->plugin>??
  • ????<!---->plugins>??
  • ??<!---->build>??
  • ??
  • <!---->project>??

  • 非常好,當(dāng)然,這只是個(gè)初始的POM,隨著bundle的開發(fā),這里面肯定有一些關(guān)于bundle的依賴配置,需要增加到MANIFAST.MF文件中去,那么怎么告訴pax打包的時(shí)候生成什么樣的MANIFAST.MF文件呢,其實(shí)也就是在org.ops4j.pax.maven這個(gè)plugin的配置段里進(jìn)行配置好了。如下,我從項(xiàng)目中,提取了一段配置的模板,大家可以參考參考

    xml 代碼
  • <plugin>????
  • ????????????????????<groupId>org.ops4j.pax.maven<!---->groupId>????
  • ????????????????????<artifactId>maven-bundle-plugin<!---->artifactId>????
  • ????????????????????<extensions>true<!---->extensions>????
  • ????????????????????<configuration>????
  • ????????????????????????<instructions>????
  • ????????????????????????????<Bundle-Version>????
  • ????????????????????????????????這里是bundle的Version????
  • ????????????????????????????<!---->Bundle-Version>????
  • ????????????????????????????<Bundle-SymbolicName>????
  • ????????????????????????????????這里是Bundle-SymbolicName的配置????
  • ????????????????????????????<!---->Bundle-SymbolicName>????
  • ????????????????????????????<!---->????
  • ????????????????????????????<_classpath>????
  • ?????????????????????????????…????
  • ????????????????????????????<!---->_classpath>????
  • ????????????????????????????<Export-Package>????
  • ????????????????????????????…????
  • ????????????????????????????<!---->Export-Package>????
  • ????????????????????????????<Import-Package>????
  • ????????????????????????????…????
  • ????????????????????????????<!---->Import-Package>????
  • ????????????????????????????<Bundle-ClassPath>????
  • ????????????????????????????????…????
  • ????????????????????????????<!---->Bundle-ClassPath>????
  • ????????????????????????????<Bundle-Activator>????
  • ????????????????????????????????…????
  • ????????????????????????????<!---->Bundle-Activator>????
  • ????????????????????????????<DynamicImport-Package>*<!---->DynamicImport-Package>????
  • ????????????????????????????<!---->????
  • ????????????????????????????<_include>????
  • ????????????????????????????????-target/classes/META-INF/details.bnd????
  • ????????????????????????????<!---->_include>????
  • ????????????????????????<!---->instructions>????
  • ????????????????????<!---->configuration>????
  • ????????????????<!---->plugin>???

  • 看見了吧,其實(shí)這個(gè)跟之前的利用maven插件來(lái)打包的方式很相似,也是把配置寫到pom之中,再由插件去進(jìn)行打包,只不過(guò)這里用的插件是pax。

    <o:p>?</o:p>

    假設(shè)我們的bundle開發(fā)好了,我們?cè)侔阎暗哪莻€(gè)test工程跑一下看看

    在test目錄下敲mvn clean install pax:provision命令。看看結(jié)果<o:p></o:p>

    <u1:p>?</u1:p><o:p></o:p>

    看見沒,在我們?cè)瓉?lái)的環(huán)境中多了一個(gè)新建的這個(gè)

    ?

    ?

    總結(jié)

    以上是生活随笔為你收集整理的OSGi Bundle之Hello World的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。