簡體   English   中英

嵌入式osgi框架,如何調用服務功能?

[英]Embedded osgi framework, how to call service functions?

我有一個簡單的java項目,叫做server。 另外我有一個osgi api項目,它定義了一個接口BlockProvider。 接下來,我有一個osgi聲明性服務項目,其中包含一個實現BlockProvider的服務。

在我的java項目'server'中,我有一個嵌入式osgi框架(在我的例子中是felix)。

我創建了一個bundleactivator,它安裝了gogo osgi包,scr包,我的api項目包和服務項目包。

工作沒有問題,我可以檢查我的服務包。

在我的服務器項目中,我想看看哪些服務實現了BlockProvider接口。 所以我實現了一個ServiceTracker,其中“BlockProvider.class.getName()”作為第二個參數(過濾器一個)。

工作也沒有問題,getServices()返回我的服務項目。

但是接下來是:我無法調用接口BlockProvider上的任何函數,因為'server'項目中的BlockProvider使用了與服務項目不同的類加載器(sun.misc.Launcher$AppClassLoader@4e0e2f2a)(o :黃色塊[6])。

我懷疑我忽略了一些基本的東西:但是如何調用實現我的BlockProvider接口的BlockProvider服務的功能呢?

如果API包由系統包/框架提供,則只能從OSGi框架外部訪問服務。 因此,您不應安裝API包,而是使用框架屬性org.osgi.framework.system.packages.extra導出API包。

這里有兩個重要的規則適用。

  1. 當兩個bundle通過服務進行通信時,他們必須同一個bundle中導入API包。 通常,您可以選擇實際導出包的哪個包。 服務提供者可以導出它,在這種情況下,消費者必須從提供者導入它。 或者,您可以使用單獨的“純API”捆綁包導出API包,提供者和使用者都可以從中導入API包。 (很少,消費者捆綁包出口包,這在OSGi中是合法的,但有點奇怪的設計。)

  2. 系統包 - 即從OSGi內部表示OSGi Framework本身的特殊包 - 無法從任何普通包中導入包。 它只能導出。

嵌入OSGi時,OSGi之外的應用程序代碼被視為系統包的一部分。 如果您希望系統包通過服務與另一個包進行通信,那么組合上述兩個規則意味着必須由系統包導出API包。 無論系統捆綁包是服務的提供者還是消費者,這都是正確的。

因此,API包必須包含在嵌入應用程序的系統類路徑中,並在使用org.osgi.framework.system.packages.extra屬性設置OSGi Framework時從系統包導出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM