Osgi 获取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

我已经编写了一个API包和一些实现服务

现在我想把它们作为插件使用,所以首先我需要一个我拥有的所有服务的列表

我以如下方式启动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服务注册表。请看一看蓝图或声明性服务。至少我建议使用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版本匹配的插件。我认为你的例子可以做到这一点吗?