2017-07-18 20 views
2

我的基于Java的项目当前正在OSGi容器中运行,其中的其他项目将注册他们的OSGi服务供其他人使用。如果我知道一个服务目前注册的,我可以简单查询,与“BundleContext的”内置方法:如何获取所有当前注册的OSGi服务的列表?

getContext().getServiceReference(LogService.class.getName()); 

不过,我希望能够查询在该上下文中注册的所有OSGi服务时刻。我查看了BundleContext的可用方法,但找不到符合我需求的任何内容。我并没有真正使用注册服务列表来使用服务对象,而只是简单地获取注册服务的名称;我不相信这会违反OSGi原则。

编辑:我没有在我的开发环境中使用Eclipse或Equinox。

编辑:如果访问OSGi服务是不可能的,或不推荐使用Java,我会打开只通过命令行注册服务,如果可能的话。

+0

https://stackoverflow.com/questions/11848839/is-there-a-way-to-view-registered-services-in-an-osgi-application –

+0

@spaniard的可能重复我会更新我的问题,包括我不使用Equinox(或Eclipse) – fojalar

+0

如果您使用Gogo:'$ allservicereferences null null'。如果你使用它,你可以使用别名:'as = {allservicereferences null null}'。然后输入'as'即可。如果你想找到一个特定的服务,你当然也可以通过'grep'管道:'$ as | grep包'。 –

回答

1

按照API docs可以调用getAllServiceReferences(null, null)方法来获得所有服务的列表:

getAllServiceReferences

ServiceReference<?>[] getAllServiceReferences(java.lang.String clazz, 
              java.lang.String filter) 
               throws InvalidSyntaxException 

返回ServiceReference对象的数组。返回的 ServiceReference对象数组包含在 指定的类下注册并匹配指定的过滤器表达式的服务。

参数:

  • clazz中 - 与服务是 类名注册或空为大家服务。
  • filter - 所有服务的过滤器表达式或 null。
+0

请注意,getAllServiceReferences也返回与您的类空间不兼容的服务。即你不能将它们投射到他们的广告类型。 'getServiceReferences'只显示那些兼容的。 –

相关问题