2012-03-28 6 views
0

私はAPIバンドルといくつかの実装サービスを書いています。apiのすべての実装を取得

今、私はそれらをプラグインとして使いたいので、まずすべてのサービスのリストが必要です。

は、私はこのようなAPIを始めている:

Framework m_fwk = new org.apache.felix.framework.FrameworkFactory().newFramework(null); 
    m_fwk.init(); 
    AutoProcessor.process(null, m_fwk.getBundleContext()); 
    m_fwk.start(); 

    Bundle api = m_fwk.getBundleContext().installBundle(
    "file:/foo/bar/api/target/api-1.0.jar"); 

    api.start(); 

はだから今APIがロードされます。今、どのバンドルがこのAPIを実装しているかを知る必要があります。どのようにフレームワークからこの情報を取得できますか?

答えて

1

あなたはAPIバンドルを読み込んでいるようですが、実装のために他のバンドルをインストールしたいと思いますか?これらのバンドルのそれぞれは、(DSを使用して)のようになります

for (File b : bundles.listFiles()) {
ctx.installBundle(b.toURI().toURL());
} :ほとんどの人は、その後、ディレクターかそこらをロード

@Component
public class Impl implements API {
public whatever() { ... }
}

これは、(例についてはbndtoolsを参照)DS用BND注釈で行われ

@Component
public class Collector {
@Reference(type='*') void addAPI(API api) { ... }
void removeAPI(API api) { ... }
}

:サービスを収集ndleようになります。ただし、Blueprint、iPojo、その他多くのヘルパーでサービスを実装/収集することもできます。

+0

mhはい、明示的にインストールする必要があるAPIがあります。次に、ディレクトリからすべてのバンドルを取得し、APIを実装するこれらのバンドルを探します。たとえば、私はプラグインAPIとたくさんのプラグインを持っています。今私は以前にインストールされたAPIバージョンiに一致するすべてのプラグインをロードしたい。私はあなたの例がこれを正しく行うと思いますか? – reox

2

OSGiサービスレジストリを再実装しようとしているようです。代わりに青写真または宣言的なサービスを見てください。少なくとも、OSGiサービスAPIを使用してサービスを登録して使用することをお勧めします。

1

FrameworkBundleであるとすれば、必要なすべてのサービスを見つけることができるBundleContextを得ることができます。特定のサービスのすべての実装者を取得するには、

m_fwk.getBundleContext().getServiceReferences("com.example.MyInterface", null) 

のような何かを行うことができます。

ただし、フレームワークの住人とは異なるクラスローダーで生活していることに注意してください。

+1

これはサービスが正しくインストールされている場合にのみ機能しますか? – reox

+0

フレームワークの住人は、自分のインターフェースとは異なる見方をしていることに注意する必要があります。割り当て可能性を心配することなく、すべての実装者が必要な場合は、 'getAllServiceReferences'を使用してください。 (この割り当て可能性があなたを魅了するならば、OSGiクラスの取り扱いについて読むことができます。) –

関連する問題