1

私のアプリケーションは、プロパティ ファイルからクラス名を取得します。これらのクラス名で表されるクラスは、事前に不明な特定の OSGI バンドルに存在する可能性があるため、それらをインスタンス化するには、まずこれらのクラスがどのバンドルに属しているかを見つける必要があります。インストールされているすべてのバンドルを BundleContext#getBundles から取得することを考えています。つまり、AbstractUIPlugin#start で BundleContext への参照を取得する必要があります。しかし、BundleContext への参照を保持することが正しいことかどうかはわかりません。開始メソッドでのみ使用する必要があるためです。したがって、バンドルのリストを取得するための代替手段について、ここで OSGI の専門家からのアドバイスが必要です。

どんな助けでも大歓迎です。

よろしく、

セティア

4

3 に答える 3

5

これは、実際にはOSGiが意図している方法ではありません。バンドルに「グローバル」コンテキストに追加するものがある場合は、サービスを登録する必要があります。したがって、共有するものがある各バンドルは、独自のstartメソッドでそれを実行できます。

他のコンポーネント(DS、ServiceTracker、ブループリントなど)は、これらのイベントをリッスンし、それに応じて動作できます。

これは非常に重要です。すべてのバンドルを手動で検索し始めると、OSGiの利点が完全に失われます。

于 2012-06-11T12:29:41.903 に答える
1

バンドルは、起動時にバンドル アクティベーターを介して、またはより適切には DS を介して制御されます。その時点でサービスをサービス レジストリに登録できるため、他のユーザーがサービスを検索/使用できるようになります。

間違いなくクラスローディング地獄で実行されるため、行く予定のルート (クラスに名前を付けるプロパティ) は悪です。モジュール性とは、実装の詳細を隠すことです。実装クラスの名前はそのような詳細です。

プロパティ ファイルで実装クラスを公開することは、非常に悪い習慣であり、モジュール性の利点が失われます。別のクラスが実装クラスまたはプロパティ ファイルを参照しているかどうかは問題ではありません。問題は impl. クラスが公開されます。

残念ながら、このモデルは私たちの業界で非常に一般的になっているため、多くの開発者はそれが正常であると考えています :-(

OSGi では、モジュール内でのみ実装クラスを認識できるようにする方法で、インターフェイスによって型指定されたインスタンスを共有できます。

于 2012-06-12T07:02:00.373 に答える
1

前に書いたように、サービスを使用して目的を達成する必要があります。実行時にインストールできるはずの 1 つ以上の実装を備えたインターフェイスがあると思います。したがって、インターフェースを実装するバンドルを制御する場合は、アクティベーターまたはブループリント コンテキストを使用して、実装をサービスとしてインストールするだけです。サービス プロパティを使用して実装を記述できます。

実装が必要なバンドルは、サービス トラッカーまたはブループリントのサービス参照を使用してサービスを検索できます。

それが不可能な場合は、バンドル コンテキストを使用して実行中のバンドルを取得し、クラスをインスタンス化できますが、これは OSGi の動作方法ではありません。クラスをインスタンス化しようとするバンドルはクラスに直接アクセスできないため、クラスローディングの問題が発生します。

于 2012-06-11T18:31:27.610 に答える