2012-09-12 50 views
0

我在普通Java應用程序中使用了兩個OSGi框架。這兩個框架都從共享目錄加載包。訪問OSGi捆綁資源時發生NullPointerException

在一個包中,我從資源中加載一個文件。我嘗試了不同的方式

this.getClass().getClassLoader().getResourceAsStream(...) 
FrameworkUtil.getBundle(XXX.class).getEntry(...) 
FrameworkUtil.getBundle(XXX.class).getResource(...) 

但是,我使用哪個命令並不重要,它在開始時都工作正常。但是,在兩個框架中進行了幾次安裝和卸載步驟之後。返回的InputStream爲null。

如果只使用一個OSGi框架,我也可以正常工作。

調試一點後,我發現,捆綁帶

FrameworkUtil.getBundle(XXX.class) 

指向正確的jar文件了,但是當我看到在捆綁的BundleData引用包文件,它引用了另一個捆綁包的捆綁文件。 bundlefiles是OSGi框架的臨時文件(在我的情況下爲Equinox),例如可以在本地Maven存儲庫中找到:

.m2 \ repository \ org \ eclipse \ osgi \ org.eclipse.osgi \ 3.6 .0.v20100517 \ configuration \ org.eclipse.osgi \ bundles \ 29 \ 1

任何人都有一個想法這裏有什麼可能是錯的?

回答

0

兩個框架都使用相同的目錄來保存軟件包的配置。看起來不小心一個框架覆蓋了另一個框架的bundle文件/配置文件。

當軟件包嘗試訪問其資源時,它會查找配置文件。如果此文件已被覆蓋,則資源文件的條目不再可用,從而導致InputStream的值爲null。

爲了避免這些類型的問題,可以通過

Map<String, String> frameworkPropertiesMap = new HashMap<String, String>(); 
frameworkPropertiesMap.put("osgi.configuration.area", "@user.home/osgi-framework-configuration-" + numberOfFramework); 
framework = getFrameworkFactory().newFramework(frameworkPropertiesMap); 
framework.start(); 
0

執行資源加載的代碼是否從框架中的包中運行?還是從框架外的代碼?

每次解析bundle時,都會得到一個新的類加載器。當bundle變得無法解析時(就像它被卸載一樣),它的類加載器被銷燬並從後臺存儲中斷開連接(例如bundle jar文件)。所以你使用的Class對象可能不再有用,因爲它是從一個現在被破壞的類加載器加載的。

請記住,在運行時,Class對象由類文件,類加載器對唯一。

+0

設置不同的配置directoy每個框架,e.g我從包代碼本身加載包的資源。因此,在資源訪問時,該包已解析並具有有效的類加載器。這些問題源於OSGi創建的配置文件。在每個配置文件中,OSGi都會將資源的文件名保存在其他內容中。如果兩個框架使用相同的配置目錄,則可以覆蓋其配置文件,導致缺少資源條目。另見我對這個問題的回答。無論如何謝謝你考慮可能的原因! – user1488793

+0

當您運行框架的多個實例時,您需要爲每個框架使用不同的存儲位置。見http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/Constants.html#FRAMEWORK_STORAGE –

+0

設置org.osgi.framework.storage以及osgi.configuration.area工作正常 – user1488793