0

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 を実装しているかを知る必要があります。フレームワークからこの情報を取得するにはどうすればよいですか?

4

3 に答える 3

2

OSGi サービス レジストリを再実装しようとしているようです。代わりに Blueprint または Declarative Services をご覧ください。少なくとも、サービスの登録と利用には OSGi サービス API を使用することをお勧めします。

于 2012-03-28T16:13:26.673 に答える
1

APIバンドルをロードするだけのようですが、実装用に他のバンドルをインストールしたいと思いますか?その後、ほとんどの人はディレクターかそこらをロードします:

for ( File b : bundles.listFiles() ) {
    ctx.installBundle( b.toURI().toURL() );
}

これらの各バンドルは、(DSを使用して)次のようになります。

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

サービスを収集するバンドルは次のようになります。

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

これは、DSのbndアノテーションを使用して行われます(例については、bndtoolsを参照してください)。ただし、Blueprint、iPojo、および他の多くのヘルパーでサービスを実装/収集することもできます。

于 2012-03-29T12:47:59.593 に答える
1

フレームワークも であることを考えると、必要なすべてのサービスを見つけることがBundleできる を取得できます。BundleContext次のようなことができます

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

特定のサービスのすべての実装者を取得します。

ただし、フレームワークの居住者とは異なるクラスローダーに住んでいることに注意する必要があります。

于 2012-03-28T19:15:39.743 に答える