我编写了一个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,我如何从框架中获取这些信息?
您似乎只加载了一个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和许多其他帮助程序中实现/收集服务。
听起来你正在尝试重新实现OSGi服务注册表。请查看蓝图或声明服务。至少我建议使用OSGi服务API来注册和使用服务。
鉴于Framework也是Bundle
,你可以得到一个BundleContext
,让你找到你需要的所有服务。你可以做点什么
m_fwk.getBundleContext().getServiceReferences("com.example.MyInterface", null)
获得给定服务的所有实现者。
但是,您应该知道您生活在与您的框架的居民不同的类加载器中。