OSGi コンテナ内のバンドル間で非 OSGi ライブラリを共有するにはどうすればよいですか?
-
22-07-2019 - |
質問
この質問に出会ったのは、 Struts パッケージを共有しようとしています OSGi コンテナ内の複数のバンドルの間で。私は、バンドル内で依存関係が重複することと、バンドル間で新しい依存関係が導入されることの両方を避けたかったのです (一方のバンドルがその内部依存関係をエクスポートして、もう一方のバンドルが共有できるようにすることで)。
Maven を使用している場合、答えは非常に簡単です。そうでない場合でも、Maven ソリューションを使用して、他のメカニズムで同じ結果を作成する方法を学ぶことができます。
このアプローチがプロジェクト中に何度も役立つことがわかったので、ここに例を投稿します。
解決 2
Maven を使用すると、任意のライブラリから OSGi バンドルを非常に簡単に作成できます。ただし、他の仕組みでも同じ結果が得られると思います。Maven ソリューションは、その仕組みを理解するのに役立ちました。
バンドルの作成は、ライブラリを依存関係として持つプロジェクトを作成し、それを使用してプロジェクトをパッケージ化することによって行われます。 Maven-バンドル-プラグイン から Apache Felix プロジェクト そしてライブラリパッケージを指定します Export-Package
命令。これを使用して、OSGi コンテナ内のバンドル間で Google プロトコル バッファを共有しました。
<?xml version="1.0" encoding="UTF-8" ?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.lib</groupId>
<artifactId>protobuf-dist</artifactId>
<version>2.1.0</version>
<name>Google Protocol Buffers OSGi Distribution</name>
<packaging>bundle</packaging>
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Export-Package>com.google.protobuf</Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
</project>
すべての推移的な依存関係もバンドルにまとめたい場合は、 bundleall
プラグインの目標。
プラグインは、依存関係内の既存の OSGi マニフェストを認識し、尊重します。
バンドル プラグインを使用してマニフェストを作成し、 jar
パッケージ化プラグイン (または jar-with-dependencies
組み込みアセンブリ) を使用して、アーカイブ セクション経由でそのマニフェストを使用します。上にリンクされているプラグインのページには、その方法が示されています。
他のヒント
Mavenにあまり興味がない、移植できない、またはant / ivyに完全に満足している人のための追加パス
指定されたタスクを達成する最も簡単な方法は、マニフェストにすべてのパッケージをエクスポートさせ、いくつかの適切なシンボル名/バージョンを追加させることにより、非OSGiライブラリをOSGiライブラリに変えることであることがわかりました。私はこれを非常に簡単に bnd でantタスクを介して(または直接コマンドラインで)行うことができました呼び出し)。また、「osgi-ified」を含むリポジトリもあります。多くの一般的なライブラリのバージョン。一部のライブラリー(joda-time)は、正しいOSGiマニフェストとともに既に出荷されています。