2015-03-13 79 views
1

我有兩個OSGi包A和B.兩者都是使用API​​ /實現模型創建的。這兩個軟件包都通過Blueprint機制激活。 API捆綁包都會導出接口,而實現捆綁包不會導出任何內容。只有A依賴於B.從一個不同的包中加載OSGi包的資源

我的問題是,我想傳遞一個資源文件名(xml文件)駐留在包A到包B(在我使用BundleContext.getServiceReferences()方法獲取B之後),然後在Bundle B中加載資源並處理它。我怎樣才能達到相同的目標,甚至是可行的?

我讀過以下帖子,尼爾巴特利特的答案表明它應該工作。

Access resources in another osgi bundle?

然而,當我讀到getEntry,findEntries,getEntrypath方法,他們不談論其他包(或者我誤會了吧)。他們只談論碎片。

我的問題是,我可以使用上述三種方法中的任何一種來達到目標​​嗎?如果是這樣,你可以指向一些其他線程有答案或一些示例代碼?

如果這是不可能的,我可以使用片段包(僅包含資源)嗎?同樣,Bundle B更像是一個提供商,它可以接收任何資源文件並對其進行處理並滿足客戶請求(Bundle A)。因此,即使我想使用bundle分片方法,我也需要B加載客戶端指定的片段bundle(僅在需要的基礎上)(比如它們提供片段bundle符號名稱)。請提供與類似問題或任何樣本相關的建議或其他帖子。

回答

1

訪問資源束中最簡單的方法是使用資源束的classLoader。在包一個,你得到的服務爲MyService做:

InputStream is = this.getClass().getResourceAsStream("myresource.xml"); 
MyService service.doSomething(is); 

,或者如果你喜歡的網址:

URL url = this.getClass().getResource("myresource.xml"); 
MyService service.doSomething(url); 

這可以作爲我們進行調用之前就已經解決了資源。如果你想給服務提供一個相對路徑,那麼你還需要給它一個classLoader來獲取資源。

ClassLoader bundleALoader = this.getClass().getClassLoader(); 
MyService service.doSomething(bundleALoader, "myresource.xml"); 

請記住儘管這this.getResource()將相對查找的資源包的「本」,而classLoder.getResource()將會從名稱空間的頂部查找。

Btw。這些概念在OSGi之外也很好。唯一不同的是,在OSGi中,您必須確保使用具有資源可見性的類加載器,而在外部通常只有一個能夠查看所有資源的類加載器。