OSGi アプリケーションで非 osgi ライブラリを使用することは可能ですか?
たとえば、私はセマンティック ベースの検索エンジンを開発しており、サード パーティの自然言語処理ライブラリ ( http://wiki.opencog.org/w/RelEx_Dependency_Relationship_Extractor ) を使用しています。
OSGi をサポートしていないライブラリを 2 つの jar ファイルとして、私の OSGi アプリケーションと接続することは可能ですか?
OSGi アプリケーションで非 osgi ライブラリを使用することは可能ですか?
たとえば、私はセマンティック ベースの検索エンジンを開発しており、サード パーティの自然言語処理ライブラリ ( http://wiki.opencog.org/w/RelEx_Dependency_Relationship_Extractor ) を使用しています。
OSGi をサポートしていないライブラリを 2 つの jar ファイルとして、私の OSGi アプリケーションと接続することは可能ですか?
以前の回答に書かれているように、バンドルで追加のライブラリを使用する場合は、2 つのオプションがあります。
最初のアプローチは、ライブラリ jar (およびそのすべての依存関係) をバンドル (ルート ディレクトリなど) にコピーしてからBundle-Classpath
要素に追加するだけでよいため、より単純ですMANIFEST.MF
(こちらを参照)。ただし、これを行っている間は、この追加されたライブラリは、それが組み込まれているバンドルでのみ表示されることを覚えておく必要があります (したがって、ライブラリの再利用は制限されています)。このライブラリからExport-package
要素にパッケージを追加MANIFEST.MF
して、他のバンドルから見えるようにすることはいつでもできますが、これは洗練されたソリューションとはほど遠いものです (ただし、機能します)。
他のバンドルから見えるようにするには、2 番目の方法を使用する必要があります。つまり、ライブラリから OSGi バンドルを作成します (これを行うのに役立つツールが Eclipse にもあります)。ただし、より複雑なライブラリの場合、このアプローチは難しい場合があります (OSGi での依存関係と特定のクラス読み込みアプローチのため)。
そのため、ライブラリを 1 つのバンドルでのみ使用する場合は、最初のアプローチを使用することをお勧めします (実装が簡単です)。このライブラリをアプリケーションの多くのバンドルで使用する場合は、2 番目の方法を検討する必要があります。
はい、外部ライブラリをバンドルに埋め込むか、ライブラリを OSGi バンドルとしてラップ (「OSGIFy」) することができます。どちらのオプションでも、Pax Construct ( http://www.ops4j.org/projects/pax/construct ) が優れたツールです。
外部ライブラリ自体に依存関係がある場合は、これらすべてを 1 つのバンドルに埋め込むか、Pax Construct を使用してそれらを推移的にラップします。
ラッピングするか埋め込むかを選択する必要がある場合は、依存関係の管理とバンドルのバージョン管理を検討してください。外部ライブラリをアップグレードする必要があり、それが独自のアプリケーション バンドルに組み込まれている場合は、常にライブラリと独自のコードの両方をリリースします。たとえば、アプリケーション バンドルの 2 つのバージョンをアクティブにせずに、ライブラリの 2 つのバージョンをアクティブにすることもできません。また... OSGi 環境で作業していない場合、アプリケーション jar にサードパーティ クラスを追加しますか? では、なぜ OSGi 環境でそれを行うのでしょうか?
このような場合、個人的には、外部ライブラリをブラック ボックスとして見て、ライブラリとその依存関係を 1 つのバンドルにラップすることを好みます。
はい、可能です。次の 2 つのオプションがあります。
まず、外部ライブラリのすべてのパッケージをバンドルのプライベート パッケージ セクションに含めることができます。このすべてのパッケージがアプリケーションの jar に含まれます。2 番目のオプションは、外部ライブラリから有効な osgi バンドルを作成することです。