2010-08-19 66 views
13

我已經使用eclipse插件項目嚮導(使用eclipse Helios)創建了兩個OSGI包A和B.訪問另一個osgi包中的資源?

在捆綁包B的清單文件中,我添加了捆綁包A作爲依賴項。此外,我已經將包導出到A中,因此它們對於B可見。我還在捆綁包A中有一個.properties文件,我希望捆綁包B可見。在捆綁包AI的build.properties窗格中指定了:

source.. = src/ 
bin.includes = META-INF/,\ 
       .,\ 
       bundle_A.properties 

現在捆綁BI嘗試使用加載屬性文件:

但是,給出了一個空指針異常(文件並沒有在類路徑中)。

是否可以從bundle A中導出資源(就像導出包時一樣)或以某種方式從B中以另一種方式訪問​​A中的文件(從bundle B訪問bundle A的classloader)?

回答

3

如果您正在編寫一個Eclipse插件,你可以嘗試像:

Bundle bundle = Platform.getBundle("your.plugin.id"); 

Path path = new Path("path/to/a/file.type"); 

URL fileURL = Platform.find(bundle, path); 

InputStream in = fileURL.openStream(); 
+0

這在Helios中顯然已棄用。 – JRSofty 2011-06-09 09:17:13

2

你有沒有考慮過添加一個方法來捆綁A的API來加載和返回資源?

許多人可能認爲這是一個更好的設計,因爲它允許的名稱或資源更改,恕不打破束A的客戶

+0

這種方法在我運行插件測試時工作。但是,當我通過啓動配置運行包時,無法找到.properties文件。設置pluign-test和OSGI運行配置有什麼區別? – u123 2010-08-20 08:22:39

1

您是否嘗試過使用捆綁A的BundleContext的加載資源的存儲方式?

+0

傑普和那工作正常,我只是困惑爲什麼它不可能加載一個資源從另一個包使用例如: this.getClass()。getClassLoader()。getResourceAsStream( 「bundle_A.properties」); 當捆綁包被指定爲依賴項,並且.properties文件位於導出的包中時。 – u123 2010-08-24 15:40:50

+0

因爲'this'在bundle A中。使用Bundle B中的類並且它可以工作。 – 2010-08-24 21:09:20

15

BundlegetEntry(String)方法用於此目的。您可以使用它來加載任何包中的任何資源。如果您不知道捆綁包內資源的確切路徑,請參閱方法findEntries()getEntryPaths()

有沒有必要抓住捆綁的類加載器來做到這一點。

+1

另請注意,不需要從軟件包A導出包含資源的軟件包。 – 2010-08-21 22:29:36

0

試用/;如果你不把/,類加載器將嘗試從相同的包中加載資源。

this.getClass().getClassLoader().getResourceAsStream("/bundle_A.properties") 
+0

這是錯誤的。它仍然只會使用bundle B的類加載器來查找捆綁B的類加載器/ – 2012-10-06 18:55:01