获得api的所有实现

时间:2012-03-28 15:20:44

标签: osgi apache-felix bundles

我编写了一个API Bundle和一些实现服务。

现在我想将它们用作插件,所以首先我需要一个包含所有服务的列表。

我正在开始这样的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。现在我需要知道哪些bundle实现了这个API,我如何从框架中获取这些信息?

3 个答案:

答案 0 :(得分:2)

听起来您正在尝试重新实现OSGi服务注册表。请查看蓝图或声明服务。至少我建议使用OSGi服务API来注册和使用服务。

答案 1 :(得分:1)

鉴于Framework也是Bundle,您可以获得BundleContext,以便找到所需的所有服务。你可以做点什么

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

获取给定服务的所有实施者。

但是,你应该知道你生活在与你的框架的居民不同的类加载器中。

答案 2 :(得分: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和许多其他帮助程序中实现/收集服务。