0

我已经编写了一个 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 已加载。现在我需要知道哪些包实现了这个 API,我如何从框架中获取这些信息?

4

3 回答 3

2

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

于 2012-03-28T16:13:26.673 回答
1

鉴于一个框架也是一个Bundle,你可以得到一个BundleContext允许你找到你需要的所有服务。你可以做类似的事情

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

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

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

于 2012-03-28T19:15:39.743 回答
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 回答