亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

幾種OSGI bundle的打包方法及注意事項?

幾種OSGI bundle的打包方法及注意事項?

慕尼黑8549860 2018-12-21 19:11:04
幾種OSGI bundle的打包方法及注意事項
查看完整描述

1 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

  前言:我相信做基于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 代碼
  <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>

  當然,這種配置就是告訴maven在對你的項目進行打包的時候直接使用resources/manifest.mf文件進行打包了,除此之外,如果你并不想一開始就指定一個MANIFAST.MF文件,而是將這個工作在打包過程交給felix去完成的話,那么你可以為MANIFAST.MF文件配置一些必要的屬性,然后felix會根據這個屬性來生成一個MANIFAST.MF一起打包到項目中,如:<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>標簽開始,你就是在手動的寫一個MANIFAST.MF文件的相關OSGI配置信息了,此外你還可以加上一些打包配置來將指定的資源文件進行打包,如:
  在<osgimanifest></osgimanifest>標簽以內加入如下的設定
  <_include>
  -target/classes/META-INF/details.bnd
  <!---->
  <_classpath>target/classes<!---->
  第一種是告訴maven將一個指定文件打包
  第二種是設定編譯后類文件的存放位置
  <o:p> </o:p>
  這里提供一個實際運用的簡要配置模板實例,大家可以稍作修改就可以直接使用了:
  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>
  以上僅是我在實際項目中打包時候的設置過得一個樣例,僅供大家參考,大家可以根據實際項目信息來自行設置自己的項目描述。具體的其他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,大家可以打開看看
  接下來我們馬上來跑下這個工程??纯磒ax會給我們帶來什么效果

  先進入到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 代碼
  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>

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



查看完整回答
反對 回復 2019-01-13
  • 1 回答
  • 0 關注
  • 958 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號