2014-10-27 12 views
1


不能得到工作參考OSGi服務

我想阿帕奇菲利克斯嵌入到使用Maven簡單的Hello World Java項目,但我不能找到一種方式來獲得一個參考捆綁服務。我已經從jar中將org.apache.felix.bundlerepository包安裝到OSGi中,並將其作爲Maven依賴項添加到我的項目中。之後,我開始捆綁,從它獲取BundleContext,然後在該捆綁上下文中調用getServiceReference(RepositoryAdmin.class.getName())。我不開心的第一件事是我必須使用BundleContext從已安裝的bundle中,如果我使用框架的BundleContext,ServiceReference將始終爲空。這並不方便。

第二,更重要的問題是,當我終於接收到從bundlerepository束RepositoryAdmin服務的引用我不能將它轉換爲org.apache.felix.bundlerepository.RepositoryAdmin,執行以下代碼:

(RepositoryAdmin)admin.getBundleContext().getService(ref) 

將拋出此異常:

java.lang.ClassCastException: org.apache.felix.bundlerepository.impl.RepositoryAdminImpl cannot be cast to org.apache.felix.bundlerepository.RepositoryAdmin 

我知道這是一種類路徑問題,並可以通過接口不兼容引起的,但我使用相同版本的一個包JAR(2.0.2 )作爲我項目的maven依賴項。 我也知道Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA osgi配置選項,它應該強制捆綁使用來自主機應用程序的包,但它並沒有幫助我。

這是我的項目https://github.com/ArtemZ/osgi-study/blob/master/src/main/java/com/artemz/demo/Main.java的主要類,這是凌亂的,因爲我嘗試了不同的東西,以便獲得對服務的引用,但沒有一個真正爲我工作。

希望有人能幫助我,因爲我真的很擔心這個問題。

回答

4

感謝您提供更多關於您在做什麼的細節。我已經按照felix名單上的郵件。 現在我想我明白髮生了什麼。爲什麼你不能從RepositoryAdmin束之外獲得服務的原因是,包你在

FRAMEWORK_SYSTEMPACKAGES_EXTRA定義爲「org.apache.felix.bundlerepository;版本= 2.0.2」

是不一樣的版本作爲RepositoryAdmin軟件包中的軟件包。我下載了捆綁,並調查了清單:

Export-Package: org.osgi.service.repository;version="1.0";uses:="org.osg 
i.resource",org.apache.felix.bundlerepository;version="2.1";uses:="org. 
osgi.framework" 

所以你看,你應該從系統中捆綁導出版本是2.1不是2.0.2。 在OSGi中,每個軟件包定義的版本不在捆綁級別上。所以雖然大多數時候它們都是相同的,但這並非總是如此。特別是OSGi規範軟件包。

所以當包的版本不同,可以有兩個作用:1。 你不會能夠找到一個服務使用不同的包裝 2.如果你得到一個服務對象以其他方式像你這樣做,那麼你由於它們是由不同的類加載器加載的,因此會產生類轉換異常。

那麼你可以試試2.1版本並報告它是否有效?

+0

哇,這實際上幫助了我!非常感謝!我預計版本2.0.2的軟件包將導出與同一版本的軟件包...我錯了。再次感謝你的幫助! – 2014-10-28 03:40:20