私はOSGI開発を始めたばかりで、依存JARの最適な処理方法を理解するのに苦労しています。
つまり、バンドルを作成する場合、サードパーティのいくつかのJARを使用する必要がある可能性が高いです。バンドルJARを作成してOSGIにデプロイすると、明らかにこれらのサードパーティJARは含まれないため、バンドルは実行されません。
これらのJARをバンドルに変換し、それらをOSGIコンテナーにデプロイすることが1つのオプションであることを理解しています。ただし、1つのバンドルでのみ使用する必要がある場合、これは理想的ではないようです。
これに対する最善の解決策は何ですか? JARをバンドルJARに埋め込むことはできますか?
ほとんどの場合、各jarを個別にバンドルします。 OSGi自体はモジュール化を目的としており、これを行わないことでシステム全体を不条理にしています。
JARをバンドルに変換する場合は、 Peter Kriensによって作成されたBNDツール を使用できます。しかし、最初に SpringSource Enterprise Bundle Repository でバンドルを探すことをお勧めします。
サードパーティjarをバンドルjarファイルのルートディレクトリに追加し、バンドルのクラスパスヘッダーをバンドルのマニフェストに追加することにより、サードパーティのjarをバンドル内に含めることができます。
Bundle-ClassPath: .,my3rdparty.jar
サードパーティのjarをサブディレクトリに配置する場合は、見出し./を使用せずにパスを指定します(例:
Bundle-ClassPath: .,lib/my3rdparty.jar # (not ./lib/my3rdparty.jar)
OSGi以外の依存関係をバンドルに埋め込むことができます。
これを簡単に行うには、Mavenを使用して依存関係を管理し、 Maven Bundle Plugin を使用してバンドルをビルドします。セクション 埋め込み依存関係で説明されているMavenバンドルプラグインの<Embed-Dependency>
および<Embed-Transitive>
命令をご覧ください。 プラグインドキュメントページの。
ローランドが指摘したように、これはOSGiの意図、つまり個々のモジュールのモジュール化と再利用に関して理想的なソリューションではありません。ただし、サードパーティの依存関係をOSGiバンドルに変換できるようになるまでは、当面は実用的なソリューションになる可能性があります。
このスレッドは少し古いですが、依存関係の埋め込みの制限の1つを指摘したかったのです。依存関係はjarレベルであることを思い出してください。ただし、パッケージをエクスポートするときには、組み込みの依存関係に由来する必要がある場合があります。これが発生すると、クラスが重複し、1つは最上位バンドルにインラインで設定され、もう1つは組み込みjarに設定されます。もちろん、埋め込みjar全体をインライン化することもできますが、それを知る前に、これは依存関係チェーン全体に伝播します。これは、ローランドなどが言及している問題の1つにすぎません。
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>