2010-08-12 82 views
3

我正在使用Apache Karaf作爲OSGi容器。卡拉夫有URL包裝,它可以直接從Maven存儲庫安裝包從一個源安裝多個包

> install mvn:com.farpost.billing/background-service/2.2-SNAPSHOT 
Bundle ID: 139 

所有的作品都很好。但我想從給定的源頭開始幾個捆綁。這是有道理的,如果新捆綁偶爾打破生產服務,我想回滾。使用OSGi這是非常簡單的

> list 
[ 139] [Active  ] [   ] [Started] [ 60] Billing background service (2.2-20100811-1232) 
[ 140] [Resolved ] [   ] [  ] [ 60] Billing background service (2.2-20100809-1127) 
> update 140 
> list 
[ 139] [Active  ] [   ] [Started] [ 60] Billing background service (2.2-20100811-1232) 
[ 140] [Resolved ] [   ] [  ] [ 60] Billing background service (2.2-20100812-1354) 
> start 140 
> stop 139 
> list 
[ 139] [Resolved ] [   ] [  ] [ 60] Billing background service (2.2-20100811-1232) 
[ 140] [Active  ] [   ] [Started] [ 60] Billing background service (2.2-20100812-1354) 
################# 
# suppose we need to rollback here 
################# 
> start 139 
> stop 140 

問題是我不能從一個源創建幾個包:

> install mvn:com.farpost.billing/background-service/2.2-SNAPSHOT 
Bundle ID: 139 
> install mvn:com.farpost.billing/background-service/2.2-SNAPSHOT 
Bundle ID: 139 

install調用不會做任何事情,但回報已經存在捆綁ID。所以我的問題,有沒有辦法從一個源URL創建幾個捆綁包?

回答

2

您正在運行到,你不能用相同的符號名和版本安裝包的多個副本的問題。

即使你可以,存在具有兩種不同的版本安裝在您所描述的場景中同捆的副作用,因爲只要是安裝的包,它可以被用來從解決包。在你的情況下,這可能不是你想要的,因爲你想要使用其中一個或其他包,但不是混合。

最後,我建議你安裝你想要的包。如果存在問題,請通過卸載有故障的軟件包並安裝舊版本來回退。如果您想自動安裝和更新(套)軟件包,請查看Apache ACE,這是OSGi的軟件配置框架,可幫助您自動執行這些方案(並管理OSGi系統)。

2

可以通過使用功能文件一次安裝多個軟件包。目前,我們有一個定義約6-7束的特徵文件。最重要的是,該文件包含一個需要其他6-7的功能。通過安裝「主」功能,Karaf可以同時安裝以下所有軟件包。如果你願意,你可以讓Karaf在啓動時運行這些捆綁包。

爲了做到這一點:

  1. 創建一個特徵文件。更可以在這裏找到:external source

  2. 提出,在您的M2目錄裏設有文件。

  3. 修改org.apache.karaf.features.cfg在Karaf主目錄。將mvn URL添加到您剛剛創建的features文件的「featuresRepositories」標籤。或者,如果您希望在啓動時加載它們,請將該功能的名稱添加到「featuresBoot」中。

  4. 在啓動Karaf,你可以輸入 「功能:安裝name_of_feature」。這將啓動功能以及功能文件所定義的其他功能。

然後,您可以鍵入list以驗證所有必需的捆綁包正在運行。如果任何軟件包發生更改或添加了新的軟件包,則需要更新該軟件的缺點。

希望這會有所幫助。

1

編輯:只看到這篇文章是一歲! Stackoverflow RSS提要把它列在我的列表頂部!?!

+ 1的馬塞爾&託尼,作爲一個既正確。

RESOLVED狀態中的一個包是活動導出/導入包(ACTIVE表示任何已激活的服務已啓動並完成),並且您應該使用Karaf功能。 目前我們手動推出我們的karaf-features文件(請參閱發行版下載中的PDF文檔),因爲v2.x插件爲每個依賴項創建了一個獨立的功能,並且有點古怪(我沒有嘗試過trunk/v3,但是它似乎是fixed

你正在嘗試有兩個陷阱;

  1. 的PAX Maven的URL處理程序命令將認識到,包已經安裝,什麼也不做
  2. 即使它沒有那麼第二個包會失敗,因爲最有可能符號的名稱將是相同的第一個

(最差)選項1:

如果你真的絕望了專門解決此問題,使用您的maven-假設捆插件,添加buildnumber-maven-plugin,這給包配置:

<Bundle-SymbolicName>${project.artifactId} ${buildNumber}</Bundle-SymbolicName> 

然後,當你安裝捆綁使用顯式快照版本(快照版本名稱在概念上只是一個存儲庫軟鏈接最新時間戳版本):

install mvn:com.farpost.billing/background-service/2.2-20100812-1354 

使用此選項,馬塞爾指出,你可以有其他有線到RESOLVED束而從ACTIVE束導入服務捆綁包導入 - 如此類的不匹配會破壞你的系統。

(不那麼糟糕)選項2:

稍微好一點的(並且沒有改變的pom.xml):

  1. 注意捆紮的確切時間戳版本
  2. 調用refresh命令
  3. 要回滾,請卸載軟件包並安裝先前提到的版本

有了這個選項,就像Tony說的那樣,你正在單獨管理所有這些包,這是一種痛苦和危險(什麼與什麼協同工作?這寫在哪裏?)。Karaf特點和versions-maven-plugin插件將是一個更好的解決方案

(良好)方案3:

  1. 分裂您的包有兩種;一個API包和實現包 - 通過這種方式來切換你的實現包(服務和實際邏輯)不會影響包裹接線只是服務解決方案
  2. 使用OSGi版本控制方案,它與maven版本控制有合理的協同作用semantic versioning pdf和Peter Kriens發佈在negative qualifiers上)。該方案是MAJOR.MINOR.MICO.qualifier,其中添加了除bug修復以外的新功能的微號
  3. SNAPSHOT應僅用於開發而非生產,因爲您正在處理未經測試的,可能發生變化的問題,移動目標(你不得不使用快照的時候通過使用時間戳版本將它們鎖定到實際使用的版本上(對於第三方依賴項,你必須使用SNAPSHOT版本,versions-maven-plugin lock-snapshots目標可以在這裏幫助)
  4. 使用卡拉夫功能,它使得大套件捆綁管理更容易管理(用一個命令部署整個堆棧並且同樣升級)