2017-11-15 6 views
1

私はOSGiセットアップにmavenを持っています。 親バンドルのpom.xmlは、JAR B(バージョン1)に依存しているJAR Aに依存しています。 親には2つの子バンドルがあります。子バンドル1は、バージョン1のJAR Bを使用します。 子バンドル2では、バージョン2のJAR Bが必要です。 JARは下位互換性がありません。したがって、JAR Bのバージョンを1から2にアップグレードすることはできません。 バンドル1でJARのバージョン1を使用し、バンドル2で同じJARのバージョン2を使用する必要があります。OSGiの2つのバンドルで同じJARの2つのバージョンを使用するにはどうすればよいですか?

現時点では、2つのバージョンを使用しているため、NoClassDefFoundエラーのためにバンドルのいずれかが失敗するクラスローディングでエラーが発生します。

OSGiを使用してこの依存関係を解決する方法を教えてください。

+0

これまでは、あなたのMavenセットアップについてしか説明していませんでした。 OSGiではこれはあまり関係ありません。OSGiの実行時には、マニフェストに含まれるImport-PackageとExport-Packageのステートメントが重要です。あなたの質問にこれを追加できますか?別物。バンドルのマニフェストはどのように作成しますか? –

+0

@ChristianSchneider両方のバンドルのImport-PackageとExport-PackageにJAR Bに関する情報を追加していません。しかし、バンドル2のRequire-Bundleプロパティに 'bundle 1'を追加しました。これは何かに影響しますか? – user2458672

+0

Require-Bundleは使用しないでください。代わりに、maven-bundle-pluginまたはbnd-maven-pluginを介してbndを実行して、マニフェストの書き込みを行います。 gjoranv提案のような依存関係を埋め込むことも可能です。 –

答えて

0

OSGi(おそらく最も重要なもの)の利点の1つは、異なるバンドルの同じライブラリの異なるバージョンを使用できることです。それが問題である場合は、「ローダ制約違反」または「ClassCastException」が発生します。 Vespa検索エンジンのOSGiトラブルシューティング文書には、いくつかのものが表示されています(examples)。これは、あなたのバンドルの1つが別のバンドルのJAR B(引数または戻り値として)のクラスを含む別のバンドルのapiを呼び出し、2つのバンドルが異なるバージョンのBを使用する場合に発生します。

あなたの場合、失敗したバンドルにImport-Packageがないか、または欠落しているクラスの必要なバージョンのパッケージをエクスポートしているバンドルがないかのいずれかです。バンドルのmanifest.mfを調べて確認することができます。

これを解決する最も簡単で安全な方法は、希望のバージョンのBをそれぞれの子バンドルに埋め込むことです。この方法では、あなたの子供のバンドルは、別々のクラスローダーで生活するBのバージョンを使用します。

バンドルのパッケージ化方法については言及していませんが、maven-bundle-pluginを使用している場合は、Embed-Dependency設定オプションがあります。 Embed-Transitiveディレクティブを使用して、Bの推移的な依存関係を埋め込み、B内で使用されるすべてのコードが実行時に使用可能になるようにする必要もあります。

Bの両方のバージョンがOSGiバンドルとしてパッケージ化されていて、それぞれ(固有のバージョン番号の)パッケージ(欠落しているクラスの)をエクスポートする場合、別の解決策が可能です。 (再度、Bのmanifest.mfを見て確認してください)。次に、両方のBバンドルをデプロイし、それぞれの子バンドルに正しいバージョンをインポートさせることができます。

+0

私の答えをいくつかの詳細と代替提案で更新しました。 – gjoranv

関連する問題