获得api的所有实现

问题描述 投票:0回答:3

我编写了一个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,我如何从框架中获取这些信息?

osgi apache-felix bundles
3个回答
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和许多其他帮助程序中实现/收集服务。


2
投票

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


1
投票

鉴于Framework也是Bundle,你可以得到一个BundleContext,让你找到你需要的所有服务。你可以做点什么

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.