2017-07-18 38 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'只顯示那些兼容的。 –

相關問題