2011-06-29 20 views
30

私のOSGiプロジェクトの各バンドルにはBundleActivatorというバンドルがありますが、これは普通だと思います。これは現在のBundleContextを渡します。これはサービス参照やその他のものを取得するのに便利です。OSGiバンドルコンテキストを取得するための最良の方法は?

しかし、バンドル内のクラスからBundleContextを取得するにはどうすればよいですか?それをBundleActivatorのパブリック静的フィールドに代入して引数として渡すこともできます。よりインテリジェントな方法がありますか?

+1

I second this:PDEによって生成されるデフォルトアクティベーターは非常に疑わしいです。私はこれをバグだと思っています:https://bugs.eclipse.org/bugs/show_bug.cgi?id=392919 – oberlies

答えて

44

FrameworkUtil.getBundle(ClassFromBundle).getBundleContext()を使用できます。

FrameworkUtil JavaDocを参照してください。

+2

ありがとう、このテクニックは私が後にしたものです。 – xconspirisist

+1

アクティベータの静的変数よりもどのように優れていますか?独自のクラスではなく、静的なフレームワークメソッドに依存しています。これにより、コードをさらに難しくすることができます。 –

+1

必ずしも良いとは限りませんが、1.アクティベータを書く必要はありません。2.別のバンドルのコンテキストを取得できます。いずれの場合でも、RaduKはOSGi固有のコードを集中管理するのは正しいです。 –

-4

ここには魔法はありません。他のクラスに情報を提供するには、何らかの方法が必要です。したがって、コールスタックを介して、またはいくつかのよく知られている場所(静的など)で入手できます。

13

私の考えでOSGiバンドルを開発するときは、OSGi関連のコードを可能な限り集中して書くことをお勧めします。この方法で、OSGi以外の環境でコードを使用したい場合、移行の労力は最小限に抑えられます。

したがって、静的リファレンスまたはFrameworkUtilを使用すると、その場所全体が良いアイフォアではありません。どちらも普通のOSGiを使用していません。 iPOJOまたは宣言的なサービスを見てみてください。

+0

洞察力のあるコメント、ありがとうございます。 OSGiとクラスを緊密に統合することは悪い習慣であると認識していますが、他の回答からのFrameworkUtilがその質問に答えました。宣言的なサービスへの参照にも感謝します。私はそれについても読んでいます。 – xconspirisist

9

また、宣言型サービスを使用してBundleContextをアクティベータメソッドに受け取ることもできます。たとえば、あなたはDSのための無買デー注釈を使用すると仮定すると:

@Activate 
public void activate(BundleContext context) { 
    // ... 
} 

しかしRaduKが、それはあなたがそのようなBundleContextとしてOSGiのAPIを使用せずに、POJOスタイルであなたのコードの大部分を書くことができればずっとましだ、言ったように。

関連する問題