4

OSGi は初めてで、Equinox を使用しています。私はいくつかの検索を行いましたが、これに対する答えが見つかりません。OSGIでのディスカッション- バンドルに必要なサード パーティの JAR の処理は多少役立ちますが、私の質問には完全には答えていません。

OSGi バンドルとして既にパッケージ化されている jar ファイルを取得しましたrabbitmq-client.jar(その MANIFEST.MF に Bundle-Name などのプロパティが含まれています)。これをバンドルとしてインストールしたいと考えています。この jar はパッケージorg.apache.commons.ioをインポートしorg.apache.commons.io.inputcommons-io-1.2.jar. RabbitMQ クライアント 2.7.1 ディストリビューションには も含まれcommons-cli-1.1.jarているため、これも必要であると推測されます。

これらのコモンズ jar のマニフェストを調べたところ、それらがバンドルとしてパッケージ化されていないようであることがわかりました。つまり、それらのマニフェストには、標準のバンドル プロパティがありません。

私の具体的な質問は次のとおりです。rabbitmq-client.jarバンドルとしてインストールする場合、コモンズ jar からインポートする必要があるパッケージにアクセスする適切な方法は何ですか? 再構築せずに考えられる代替案は 3 つだけrabbitmq-client.jarです。

  1. commons jar のパッケージは、すでに Equinox グローバル クラスパスに含まれており、rabbitmq-client.jarそこから自動的に取得されます。
  2. 2 つの commons jar を含む別のバンドルを作成し、必要なパッケージをエクスポートして、そのバンドルを Equinox にインストールする必要があります。
  3. Equinox を起動するときに、これら 2 つの Commons jar をグローバル クラスパスに配置する必要がrabbitmq-client.jarあります。

通常、OSGi コンテナではグローバル クラスパスを使用しないと読みました。個々のバンドル クラスパスを構築するときに、グローバル クラスパスのアイテムを使用できるかどうかについては明確ではありません。ただし、rabbitmq-client.jarなどの他のパッケージもインポートすることに注意してくださいjavax.net。これは、グローバルクラスパスからのものと思われます。または、それらをエクスポートする他のバンドルがありますか?

ご協力ありがとうございます。

4

3 に答える 3

5

解決策(2)が正しい方法です。(1)と(3)は機能しません。これは、すでに理解しているように、OSGiにはグローバルクラスパスなどがないためです。

各バンドルは必要なすべてのパッケージをインポートし、それらのパッケージは別のバンドルによってエクスポートする必要があります。これには例外があります。これは、名前空間の下にあるすべてのクラスです...つまり、java.*インポートする必要はありません。java.langjava.util

このようなパッケージjavax.netはJREから提供されますが、まだ「グローバルクラスパス」にはありません。システムバンドルと呼ばれる特別なバンドルがあります。これは、OSGi内のOSGiフレームワーク自体を表します。そのバンドルは、、、などのJREからのパッケージの束をエクスポートしjavax.netます。javax.swingorg.w3c.dom

于 2012-06-27T21:20:50.373 に答える
3

また、Neil が言ったことに加えて、commons-io のような人気のあるバンドルについては、他の誰かが既に行っているため、通常はオプション (2) は必要ありません。多くの変換されたバンドルを含む SpringSource リポジトリがあります。commons-io の場合は、maven central の「公式」jar のバージョン 1.4 が既にバンドルされているため、さらに改善できます。

于 2012-06-28T02:05:38.580 に答える