web-dev-qa-db-ja.com

OSGI-バンドルに必要なサードパーティJARの処理

私はOSGI開発を始めたばかりで、依存JARの最適な処理方法を理解するのに苦労しています。

つまり、バンドルを作成する場合、サードパーティのいくつかのJARを使用する必要がある可能性が高いです。バンドルJARを作成してOSGIにデプロイすると、明らかにこれらのサードパーティJARは含まれないため、バンドルは実行されません。

これらのJARをバンドルに変換し、それらをOSGIコンテナーにデプロイすることが1つのオプションであることを理解しています。ただし、1つのバンドルでのみ使用する必要がある場合、これは理想的ではないようです。

これに対する最善の解決策は何ですか? JARをバンドルJARに埋め込むことはできますか?

39
William

ほとんどの場合、各jarを個別にバンドルします。 OSGi自体はモジュール化を目的としており、これを行わないことでシステム全体を不条理にしています。

JARをバンドルに変換する場合は、 Peter Kriensによって作成されたBNDツール を使用できます。しかし、最初に SpringSource Enterprise Bundle Repository でバンドルを探すことをお勧めします。

27

サードパーティjarをバンドルjarファイルのルートディレクトリに追加し、バンドルのクラスパスヘッダーをバンドルのマニフェストに追加することにより、サードパーティのjarをバンドル内に含めることができます。

Bundle-ClassPath: .,my3rdparty.jar

サードパーティのjarをサブディレクトリに配置する場合は、見出し./を使用せずにパスを指定します(例:

Bundle-ClassPath: .,lib/my3rdparty.jar # (not ./lib/my3rdparty.jar)
40
William

OSGi以外の依存関係をバンドルに埋め込むことができます。

これを簡単に行うには、Mavenを使用して依存関係を管理し、 Maven Bundle Plugin を使用してバンドルをビルドします。セクション 埋め込み依存関係で説明されているMavenバンドルプラグインの<Embed-Dependency>および<Embed-Transitive>命令をご覧ください。 プラグインドキュメントページの。

ローランドが指摘したように、これはOSGiの意図、つまり個々のモジュールのモジュール化と再利用に関して理想的なソリューションではありません。ただし、サードパーティの依存関係をOSGiバンドルに変換できるようになるまでは、当面は実用的なソリューションになる可能性があります。

9
Pavol Juhos

このスレッドは少し古いですが、依存関係の埋め込みの制限の1つを指摘したかったのです。依存関係はjarレベルであることを思い出してください。ただし、パッケージをエクスポートするときには、組み込みの依存関係に由来する必要がある場合があります。これが発生すると、クラスが重複し、1つは最上位バンドルにインラインで設定され、もう1つは組み込みjarに設定されます。もちろん、埋め込みjar全体をインライン化することもできますが、それを知る前に、これは依存関係チェーン全体に伝播します。これは、ローランドなどが言及している問題の1つにすぎません。

6
Ed Ost

Maven Bundle Plugin を使用している場合の例を次に示します。

注:このプラグインは、依存関係に必要なパッケージを自動的にインポートします。これはあなたにとって問題かもしれませんし、そうでないかもしれません。ありがたいことに、実際にインポートする必要のないパッケージを抑制することができます(以下を参照)。

    <Import-Package>
        <!-- this was imported by one of the dependencies; I don't really need it -->
        !org.Apache.jackrabbit.test,
        *
    </Import-Package>
    <Include-Resource>
        lib/concurrent-1.3.4.jar,
        lib/jackrabbit-core-2.6.5.jar,
        lib/jackrabbit-spi-2.6.5.jar,
        lib/jackrabbit-spi-commons-2.6.5.jar,
        lib/lucene-core-3.6.0.jar,
        lib/tika-core-1.3.jar
    </Include-Resource>
    <Bundle-ClassPath>
        .,
        concurrent-1.3.4.jar,
        jackrabbit-core-2.6.5.jar,
        jackrabbit-spi-2.6.5.jar,
        jackrabbit-spi-commons-2.6.5.jar,
        lucene-core-3.6.0.jar,
        tika-core-1.3.jar
    </Bundle-ClassPath>
4
shreyas