3

私はApacheKarafをOSGiコンテナーとして使用しています。Karafには、Mavenリポジトリから直接バンドルをインストールできるURLラッパーがあります

> 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

問題は、1つのソースから複数のバンドルを作成できないことです。

> 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

2番目installの呼び出しは何もしませんが、既存のバンドルIDを返します。だから私の質問、1つのソースURLから複数のバンドルを作成する方法はありますか?

4

3 に答える 3

2

同じシンボリック名とバージョンのバンドルの複数のコピーをインストールできないという問題が発生しています。

できたとしても、説明したシナリオで同じバンドルの 2 つの異なるバージョンをインストールすると、副作用があります。バンドルがインストールされている限り、パッケージの解決に使用できるからです。あなたのシナリオでは、どちらか一方のバンドルを使用したいが、ミックスは使用したくないので、それはおそらくあなたが望むものではありません。

最後に、必要なバンドルだけをインストールすることをお勧めします。問題がある場合は、障害のあるバンドルをアンインストールし、古いバージョンをインストールしてロールバックします。バンドル (のセット) のインストールと更新を自動化したい場合は、OSGi 用のソフトウェア プロビジョニング フレームワークである Apache ACE を検討してください。これは、そのようなシナリオの自動化 (および OSGi システム全般の管理) に役立ちます。

于 2010-08-14T22:02:11.227 に答える
2

features ファイルを使用して、一度に複数のバンドルをインストールすることができます。現在、約 6 ~ 7 個のバンドルを定義する機能ファイルがあります。その上、ファイルには、他の 6 ~ 7 を必要とする 1 つの機能が含まれています。「マスター」機能をインストールすることにより、Karaf は次のすべてのバンドルを同時にインストールします。また、必要に応じて、Karaf にこれらのバンドルを起動時に実行させることもできます。

これを行うためには:

  1. 機能ファイルを作成します。詳細はこちら:外部ソース

  2. その機能ファイルを m2 ディレクトリのどこかに置きます。

  3. Karaf ホーム ディレクトリの org.apache.karaf.features.cfg を変更します。作成したばかりの機能ファイルへの mvn URL を「featuresRepositories」タグに追加します。必要に応じて、起動時に機能をロードする場合は、機能の名前を「featuresBoot」に追加します。

  4. Karaf を起動したら、「features:install name_of_feature」と入力できます。これにより、機能ファイルで定義されているように、機能と機能が必要とするその他すべてが開始されます。

その後、list と入力して、必要なすべてのバンドルが実行されていることを確認できます。これには、バンドルが変更された場合、または新しいバンドルが追加された場合に更新する必要があるという欠点があります。

お役に立てれば。

于 2011-08-19T16:04:56.267 に答える
1

編集: この投稿を見たのは 1 年前です! Stackoverflow RSS フィードは、これを私のリストの一番上に置きました!?!

+1 はマルセルとトニーに、どちらも正しい。

RESOLVED状態のバンドルは、パッケージのエクスポート/インポートのアクティビティ ( ACTIVEは、サービスのアクティブ化が開始され完了したことを意味します) であり、Karaf 機能を使用する必要があります。v2.xプラグインは依存関係ごとに個別の機能を作成し、少し風変わりであるため、現在、karaf-featuresファイルを手動でロールします(配布ダウンロードのPDFドキュメントを参照)。修正されたようです)

あなたがしようとしていることには、2 つの落とし穴があります。

  1. pax maven url handler コマンドは、バンドルが既にインストールされていることを認識し、何もしません。
  2. たとえそうであったとしても、シンボリック名が 1 番目と同一である可能性が最も高いため、2 番目のバンドルは失敗します。

(最悪) オプション 1:

これを具体的に回避したい場合は、maven-bundle-plugin を使用していると仮定して、buildnumber-maven-pluginとこれをバンドル構成に追加します。

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

次に、バンドルをインストールするときに、明示的なスナップショット バージョンを使用します (バージョン名の SNAPSHOT は、概念的には、最新のタイムスタンプ付きバージョンへのリポジトリ ソフト リンクにすぎません)。

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

このオプションを使用すると、Marcel が述べているように、 ACTIVEバンドルからサービスをインポートしている間に、他のバンドル パッケージ インポートをRESOLVEDバンドルに関連付けることができます。そのため、クラスの不一致によってシステムが壊れます。

(悪くない) オプション 2:

少し良くなりました (pom.xml に変更はありません):

  1. バンドルの正確なタイムスタンプ付きバージョンに注意してください
  2. refreshコマンドを呼び出す
  3. ロールバックするには、バンドルをアンインストールし、以前にメモしたバージョンをインストールします

このオプションを使用すると、Tony が述べているように、すべてのバンドルを個別に管理することになりますが、これは面倒で危険です (何が何と機能するのか? これはどこに書かれているのか?)。Karaf機能とversions-maven-pluginプラグインは、はるかに優れたソリューションです

(良い) オプション 3:

  1. バンドルを 2 つに分割します。API バンドルと実装バンドル - そうすれば、実装バンドル (サービスと実際のロジック) を切り替えても、サービスの解決のみを配線するパッケージには影響しません。
  2. OSGi のバージョニング スキームを使用してください。Maven のバージョニングと合理的な相乗効果があります (セマンティック バージョニングの PDFと、Peter Kriens の負の修飾子に関する投稿を参照してください)。スキームは MAJOR.MINOR.MICO.qualifier で、バグ修正以外の新しい機能を追加しないマイクロ番号です。
  3. SNAPSHOT は、テストされていない、変更される可能性のある、移動するターゲットで作業しているため、本番ではなく開発にのみ使用する必要があります (スナップショットを使用する必要がある場合は、タイムスタンプを使用して実際に作業したバージョンにロックダウンします)。バージョン (サードパーティの依存関係については、SNAPSHOT バージョンを使用する必要があります。ここでは、versions-maven-plugin lock-snapshotsゴールが役立ちます)
  4. Karaf 機能を使用すると、大規模なバンドル スイートの管理がはるかに簡単になります (1 つのコマンドでスタック全体をデプロイし、同様にアップグレードします)。
于 2011-08-20T17:55:00.283 に答える