Osgi 获取api的所有实现
我已经编写了一个API包和一些实现服务 现在我想把它们作为插件使用,所以首先我需要一个我拥有的所有服务的列表 我以如下方式启动api:Osgi 获取api的所有实现,osgi,apache-felix,bundles,Osgi,Apache Felix,Bundles,我已经编写了一个API包和一些实现服务 现在我想把它们作为插件使用,所以首先我需要一个我拥有的所有服务的列表 我以如下方式启动api: Framework m_fwk = new org.apache.felix.framework.FrameworkFactory().newFramework(null); m_fwk.init(); AutoProcessor.process(null, m_fwk.getBundleContext()); m_fwk.sta
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服务注册表。请看一看蓝图或声明性服务。至少我建议使用OSGi服务API来注册和使用服务。听起来您好像在尝试重新实现OSGi服务注册表。请看一看蓝图或声明性服务。至少我建议使用OSGi服务API来注册和使用服务。鉴于a也是一个
捆绑包
,您可以获得一个BundleContext
,它允许您查找所需的所有服务。你可以这样做
m_fwk.getBundleContext().getServiceReferences("com.example.MyInterface", null)
获取给定服务的所有实现者
但是,您应该知道,您所处的类加载器与框架中的居民不同。鉴于a也是一个捆绑包
,您可以获得一个捆绑文本
,它允许您查找所需的所有服务。你可以这样做
m_fwk.getBundleContext().getServiceReferences("com.example.MyInterface", null)
获取给定服务的所有实现者
但是,您应该知道,您所处的类加载器与框架中的居民不同。您似乎只加载了一个API包,我猜您想为实现安装其他包吗?大多数人会加载一个左右的导演:
for ( File b : bundles.listFiles() ) {
ctx.installBundle( b.toURI().toURL() );
}
这些捆绑包中的每一个都应该如下所示(使用DS):
收集服务的捆绑包可能如下所示:
@Component
public class Collector {
@Reference(type='*')
void addAPI( API api ) { ... }
void removeAPI( API api ) { ... }
}
这是通过DS的bnd注释完成的(请参见bndtools以获取示例)。但是,您也可以在Blueprint、iPojo和许多其他助手中实现/收集服务 您似乎只加载了一个API包,我想您想为实现安装其他包吗?大多数人会加载一个左右的导演:
for ( File b : bundles.listFiles() ) {
ctx.installBundle( b.toURI().toURL() );
}
这些捆绑包中的每一个都应该如下所示(使用DS):
收集服务的捆绑包可能如下所示:
@Component
public class Collector {
@Reference(type='*')
void addAPI( API api ) { ... }
void removeAPI( API api ) { ... }
}
这是通过DS的bnd注释完成的(请参见bndtools以获取示例)。但是,您也可以在Blueprint、iPojo和许多其他助手中实现/收集服务 嗯,您需要知道,框架的居民对您的界面的看法与您不同。如果您只需要所有的实现者,而不必担心可分配性,请使用
getAllServiceReferences
。(如果这种可分配性让你眼花缭乱,你可以阅读OSGi类处理。)好吧,你需要意识到框架的居民对你的接口的看法与你不同。如果您只需要所有的实现者,而不必担心可分配性,请使用getAllServiceReferences
。(如果这个可分配性的东西让你眼花缭乱,你可以阅读OSGi类处理。)是的,我想要一个API,我需要安装它。然后我想从一个目录中获取所有bundle,并查找这些实现API的bundle。例如:我有一个插件API和许多插件。现在我想加载所有与我之前安装的API版本匹配的插件。我认为你的例子可以做到这一点吗?是的,我想要一个API,我需要安装它。然后我想从一个目录中获取所有bundle,并查找这些实现API的bundle。例如:我有一个插件API和许多插件。现在我想加载所有与我之前安装的API版本匹配的插件。我认为你的例子可以做到这一点吗?