當前位置:首頁 » 網頁前端 » osgifelixweb
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

osgifelixweb

發布時間: 2022-06-08 20:01:17

① 幾種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