我编写了一个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,我如何从框架中获取这些信息?
答案 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和许多其他帮助程序中实现/收集服务。