① 幾種OSGI bundle的打包方法及注意事項
前言:我相信做基於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,大家可以打開看看
接下來我們馬上來跑下這個工程。看看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 代碼
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的配置段里進行配置好了。如下,我從項目中,提取了一段配置的模板,大家可以參考參考
② apache felix webconsole怎麼訪問
一個Http Service 實現 ,可選在一下服務:
Apache Felix Http Service,Pax Web Service,Equinox Http Service Implementation.
可選依賴:
OSGi Log Service: If installed, the console provides access to the log entries
OSGi Configuration Admin Service and OSGi Metatype Service: If installed, the console
provides configuration administration functionality
Apache Felix Declarative Services: If installed, the console provides functionality
to inspect declared components
③ osgi裡面怎麼整合cxf生成的webservice客戶端
你可以試試把webservices-api-2.0.1.jar這個jar包刪了
④ 下載了oracle 的osgi後怎麼安裝、
1、在工作站上安裝了Felix 1.0之後,請確定將示例下載中創建的所有OSGi程序包復制到名為bundle的Felix子目錄中。
2、轉到Felix的頂層目錄並調用以下命令:java -jar bin/felix.jar。
3、提示輸入profile name,輸入後按enter鍵。
4、如果是在*nix站上,Felix將在主目錄/.felix目錄下以此名稱創建一個子目錄來放置安裝的OSGi程序包。
5、輸入概要文件名稱之後,您將在命令提示中看到首先裝載的OSGi程序包。至此,您應該看到如下的事件序列:[Assuming inside top level Felix directory]
[web@ws_osmosis felix-1.0.0]$ java -jar bin/felix.jar
Welcome to Felix.
=================
Enter profile name: introtutorial
DEBUG: WIRE: 1.0 -> org.osgi.service.packageadmin -> 0
DEBUG: WIRE: 1.0 -> org.osgi.service.startlevel -> 0
DEBUG: WIRE: 1.0 -> org.ungoverned.osgi.service.shell -> 1.0
DEBUG: WIRE: 1.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 1.0 -> org.apache.felix.shell -> 1.0
DEBUG: WIRE: 2.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 2.0 -> org.apache.felix.shell -> 1.0
DEBUG: WIRE: 3.0 -> org.osgi.service.obr -> 3.0
DEBUG: WIRE: 3.0 -> org.osgi.framework -> 0
DEBUG: WIRE: 3.0 -> org.apache.felix.shell -> 1.0
->
⑤ 哪些開源項目基於osgi
Eclipse 本身基於osgi
所有RCP 和RAP 項目都是基於osgi
另外有一些 web項目也是基於osgi, 可以去國外論壇搜索 osgi 相關項目
⑥ OSGi主要應用場景還前景,最好是說說實例
先說前景。
1 對於技術本身分的前景還是很看好的,現在各大伺服器廠商都在使用OSGI重構自己的伺服器。
2.對於國內的開發者而言,前景不好說。由於國內大部分的開發者跟伺服器開發和IDE開發關系不大。似乎更重視應用程序的可用性,至於擴展性、可維護性關注都不是特別高。所以OSGI方面的需求人員不是很大
再說說應用場景
1. 關於OSGI的歷史。OSGI前期主要是設計於嵌入式應用程序。由一個平台支撐可熱插拔的應用程序模塊。現在OSGI企業級規范已經發布,意味著OSGI也可以應用到企業級開發過程中。
2. 由於OSGI本身提供的便利的模塊化的功能,個人覺得主要應用於需求經常變化的應用中。這里不只有嵌入式、桌面程序也包括企業級開發的應用場景。由於需求的不斷變化導致各個模塊需要升級的需求,可以在動態的更新和良好的擴展性OSGI框架下有很好的支持。
順便說下,OSGI下的設計是非常有深度的。稍微有別於一般的應用程序設計。動態的更新和良好的擴展性,這個主要是OSGI框架為開發提供支持。但是並非說使用了OSGI就有動態的更新和良好的擴展性。我現在看過的OSGI上的設計,除了一些eclipse插件方面設計非常出色,但更多見到過的軟體被設計的非常難於擴展和升級維護。
⑦ 使用OSGI開發webapp 怎麼添加filter
根據你的描述: web bundle 我的實現方法是在OSGi中加入一個jetty bundle,其他bundle引用這個HttpService,並把自己加入到這個HttpService中。
⑧ 我有1個基於OSGI多bundle的項目,現在要導入到eclipse,可是所有bundle都在1個項目下,不知道該怎麼導入
這要看你的工程的結構是怎麼樣的了,可以作為多個工程導入,也可以做為一個工程導入……
⑨ osgi web應用 怎樣部署
osgi web應用 怎樣部署
省略了「表達式3(循環變數增量)」, 則不對循環控制變數進行操作,這時可在語句體中加入修改循環控制變數的語句。
例如:
for(i=1;i<=100;)
{sum=sum+i;
i++;}
5) 省略了「表達式1(循環變數賦初值)」和「表達式3(循環變數增量)」。
例如:
for(;i<=100;)
{sum=sum+i;
i++;}
相當於:
while(i<=100)
{sum=sum+i;
i++;}
6) 個表達式都可以省略。
例如:
for(;;)語句
相當於:
while(1)語句
⑩ weblogic是否支持osgi
WebLogic Server uses OSGi for internal molarization. OSGi has also
been used to deliver procts like Oracle Complex Event Processor (CEP)
in Oracle SOA Suite from WebLogic Server.
WebLogic 本身是基於OSGi框架實現的,
所以肯定是支持OGGi的,
但如何讓OSGi框架和JavaWeb技術銜接,並沒有規定
一般兩種銜接方式:
OSGi -> WebContainer ,或 WebContainer ->Servlet Bridge-> OSGi
關鍵不是容器是否支持OSGi,而是JEE標准中完全沒有OSGi的內容。
怎麼把這兩套體系連接起來,目前沒有統一的方案