2012-09-13 33 views
1

問題嵌入式菲利克斯無法施展活化劑的BundleActivator

我有我的實例的OSGi bundle激活在菲利克斯OSGi容器中的一個問題。當我嘗試啓動捆綁包時,出現錯誤,我無法將激活碼類型投射到org.osgi.framework.BundleActivator,儘管事實上這是在項目中定義的父類。

我已將org.osgi:org.osgi.core:5.0.0包含在激活的包中,以便激活器的類可以被啓動。我是否需要引用OSGi包中的OSGi庫或者Felix容器是否爲我提供這些庫?

無論是運行嵌入的Felix還是從命令行運行,我都有同樣的問題。

** **解決方案

原來Felix的OSGi的版本比最新標準以上。由於我是OSGi的新手,我只是抓住所有最新的東西並開始開發。我已經從版本5.0.0遷移到4.3.0。我注意到唯一的區別是在API中缺乏很好的泛型。

現在我的類是兼容的,它們可以在容器中啓動時解析。以前的問題只是由於庫的版本。

背景

我有一個Maven構建了未啓動的項目,因爲它找不到依賴於org.osgi.framework(vesrion> = 1.7.0)(!(版本> = 2.0 .0))。

項目configuraiton是

Main 
    SubProjectApi 
    SubProjectImpl 
    SubProjectIntegrationTest 

凡SubProjectImpl有依賴關係SubProjectApi。 SubProjectApi有一個使用maven-bundle-plugin構建的包,但不包含任何OSGi引用。 SubProjectImpl引用Api模塊並提供一個BundleActivator。爲了解決OSGi類,該項目依賴於org.osgi:org.osgi.core:5.0.0。一切都很好。

SubProjectIntegrationTest項目提供了一組單元測試,以確保SubProjectImpl在嵌入式Felix環境中正常工作。我按照指南設置Felix實例(創建Activators,引用所需的罐子等)。由於測試環境和OSGi都需要相同的API類,因此我使用org.osgi.framework.system.packages.extra配置選項來共享API類。

當測試開始下面的錯誤,製作

ERROR: Bundle dsto.lod.simr.core [12] 
    Error starting file:target/SubProjectImpl.jar 
    (org.osgi.framework.BundleException: Unresolved constraint in bundle 
    project.impl [12]: Unable to resolve 12.0: 
    missing requirement [12.0] osgi.wiring.package; 
    (&(osgi.wiring.package=org.osgi.framework)(version>=1.7.0)(!(version>=2.0.0)))) 

我以爲菲利克斯環境會自動提供這些類。我將org.osgi.core模塊添加到了環境中,問題變成了我使用的類型。

回答

2

您不應該安裝Core API軟件包。這些包由框架實現導出。如果您安裝捆綁軟件並針對捆綁軟件進行解析,那麼您的捆綁軟件和框架工具將爲這些類使用不同的Class對象。

您還需要針對版本小於或等於框架實現支持的版本的核心API進行編譯。它看起來像是針對核心5.0編譯的,而框架實現是針對核心4.3(或其他5.0以下的版本)。

+1

謝謝。我已經轉向使用'org.apache.felix:org.apache.felix.main:4.0.3'來提供Maven構建中的OSGi組件,但不喜歡指定供應商特定的OSGi,但構建的確如此工作和組件在嵌入式Felix中啓動。然後我改爲'org.osgi:org.osgi.core:4.3.0',這也起作用了。激活的bundle現在不包含任何OSGi依賴項。 – Lance

+0

爲了強調一下,導入一個包和在你的包中嵌入一組類是有很大區別的。導入很好,但嵌入會導致類路徑混亂。使用Maven Bundle插件並不總是清楚你做了什麼,所以值得檢查一下你的清單和bundle,看看它爲你帶來了什麼。聽起來像'包含'意味着你知道它嵌入了你的依賴關係,但它是一種模棱兩可的詞。 –

+0

導入和嵌入有微妙的折衷。由於框架診斷出問題,導入更安全。由於您擁有更少的依賴關係,因此嵌入具有更易於使用的優勢。 –

0

我在基於Maven的項目中遇到了問題,導入看起來是正確的。問題在於接口的一些不正確的版本被緩存了。它在清除緩存後工作。

要經常清除啓動時的高速緩存中,我使用的配置參數org.osgi.framework.Constants.FRAMEWORK_STORAGE_CLEAN

Map<String, String> config = new HashMap<>(); 
config.put(Constants.FRAMEWORK_STORAGE_CLEAN, 
      Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT); 
Framework framework = frameworkFactory.newFramework(config); 
相關問題