3

OSGi の初心者として、私は OSGi ランタイムの境界に頭を悩ませようとしています。OSGi でビルドされていない、つまり OSGi コンテナーで実行されていない私のアプリは、実行時に OSGi バンドルを展開する OSGi コンテナーを開始します。これらのバンドルの一部は、サービスを登録します。その後、OSGi 以外のコードで、これらのサービスを取得して使用します。

ここで OSGi の境界に弱い心を巻き込むのに苦労しています。具体的に言うと、サービスを取得してそのメソッドの 1 つを呼び出す場合、後続のすべての実行が OSGi コンテナー (Felix) 内で実行されていると想定できますか? 言い換えれば、そのコードの依存関係は OSGi のモジュール性メカニズムによって解決されるのでしょうか? または、OSGi 以外のコードからサービスを使用しているため、その OSGi 管理を失いましたか?

私の質問が OSGi に関する明らかな誤った仮定に基づいていると思われる場合は、遠慮なく指摘してください。

4

2 に答える 2

1

チャド、あなたの質問により効果的に答えるために、いくつか知りたいことがあります: 1) 外部アプリケーションからサービス参照をどのように正確に取得していますか? 2) 外部アプリケーションはスタンドアロン アプリケーションですか、それとも別のコンテナー内にありますか? もしそうなら、それを実現する方法があります。

あなたが提起する質問は興味深いものです。それを文脈に入れましょう。外部アプリケーションによって Felix から OSGi サービスへの参照を取得できると仮定しましょう。このサービスを使用すると、インターフェイスを介して対話します。OSGi のそのインターフェースでは、インポート ステートメントが参照されます。このステートメントは、インターフェースのメソッド シグネチャおよび最終的な属性で使用されます。これらのインポート ステートメントには、 pom.xml ファイルで定義された、一致する依存ライブラリが含まれます。

外部アプリケーションでサービスを使用するには、インターフェースを含み、インターフェースの依存関係を参照する API ".jar" ファイルを公開する必要があります。外部アプリケーションはその API を使用する必要があり、.war、.jar、または .ear ファイルの lib ディレクトリにアセンブルされる可能性があります。このため、外部アプリケーションの依存関係が API の依存関係と競合することはありません。

API を使用できる限り、その通りです。SPI の依存関係は問題になりません。外部アプリで Spring 3.0.4.RELEASE を使用し、OSGi アプリケーションで Spring 2.5.6.SNAPSHOT を引き続き使用できます。API に外部アプリケーションと競合する依存関係がない限り、問題はありません。ここでの秘訣は、インターフェースを API として最小限の .jar ファイルに入れ、実装の詳細を SPI に入れる必要があるということです。外部 ap は API を使用し、OSGI 内部では API と SPI の両方を使用します。

これが役立つかどうか教えてください。

于 2012-02-03T04:30:24.667 に答える
0

依存関係が満たされない限り、バンドルはサービスを提供できないため、サービスを取得できる場合、定義により依存関係は満たされます。外部でサービスを実行しても、実際には何も変わりません。

于 2012-02-01T16:59:30.017 に答える