2013-04-22 24 views
1

我的目標是從我的軟件包中刪除對OSGi的依賴關係。我使用felix(v 4.2.1)作爲impl並運行它可嵌入。我安裝org.apache.felix.scr(v。1.6.2)軟件包以具有Service Component Runtime支持。但是當我跑使用服務組件運行時

ServiceReference ref = bundleContext().getServiceReference(ScrService.class.getName()); 
ScrService s = (ScrService) bundleContext().getService(ref); 

我得到ClassCastException: org.apache.felix.scr.impl.ComponentRegistry cannot be cast to org.apache.felix.scr.ScrService

好的。我將修改系統軟件包。

config.put(Constants.FRAMEWORK_SYSTEMPACKAGES, "org.apache.felix.scr"); 

現在,我得到

Caused by: org.osgi.framework.BundleException: Unresolved constraint in bundle org.apache.felix.scr [1]: Unable to resolve 1.0: missing requirement [1.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework)(version>=1.4.0)(!(version>=2.0.0))) 
     at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3974) 
     at org.apache.felix.framework.Felix.startBundle(Felix.java:2037) 
     at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955) 
     at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942) 
     at com.copyright.rup.communications.felix.Felix.addBundle(Felix.java:86) 
     ... 28 more 

我該如何解決呢?

回答

4

我懷疑你試圖弄到ScrService的第一個塊位於嵌入端(即在框架之外,而不是在已安裝的bundle中)。

如果是這種情況,那麼您有兩個ScrService的副本 - 一個從您的嵌入代碼的ClassLoader加載,一個由scr bundle的ClassLoader加載,當它由框架解析時。這就是爲什麼你看到ClassCastException

您可以直接導出SCR包從框架包中導出的內容。

OSGi Core spec v5的第3.8節第3.8頁指出,如果一個模塊同時具有同一個包的導入和導出定義,那麼在解析捆綁線時,框架將首先嚐試解析外部,如果成功則放棄重疊的導出定義。

所以SCR運行包的出口包裝清單頭複製爲一個框架屬性:

properties.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, 
     "org.ops4j.pax.url.mvn,org.apache.felix.scr;uses:=\"org.osgi.framework," + 
     "org.osgi.service.component\";version=\"1.7\"," + 
     "org.apache.felix.scr.component;status=provisional;mandatory:=status;" + 
     "uses:=\"org.osgi.service.component\";version=\"1.0\"," + 
     "org.osgi.service.component;uses:=\"org.osgi.framework\";version=\"1.2\""); 

//Which you pass to the FrameworkFactory ... 

ServiceLoader<FrameworkFactory> loader = ServiceLoader.load(FrameworkFactory.class); 
Iterator<FrameworkFactory> iterator = loader.iterator(); 
Framework framework = iterator.next().newFramework(properties); 
framework.start(); 

幾件事情需要注意:

  • 如果您還沒有使用ConfigurationAdmin,那麼還要安裝org.osgi.compendium以確保您至少擁有org.osgi.service.cm.*org.osgi.service.metatype*的API類,AFAIK這些是SCR運行時所必需的。

  • 你不應該使用Constants.FRAMEWORK_SYSTEMPACKAGES,除非你認真定製實際的框架,而不是你可能想使用Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA延長什麼是由框架bundle導出。 (框架實現對於FRAMEWORK_SYSTEMPACKAGES有很好的默認值,嵌入時通常不需要修改)。

+1

是有點更清晰的瞭解是什麼原因造成了解析錯誤的問題的第二部分...通過FRAMEWORK_SYSTEMPACKAGES,他已刪除**所有**系統捆綁出口,除了'org.apache。 felix.scr'。所以,再見了'org.osgi.framework' ... bye bye'javax。*'...你得到了圖片。使用FRAMEWORK_SYSTEMPACKAGES_EXTRA *應該*修復它。 – 2013-04-22 19:57:25

+0

+1應該明確提到。 – earcam 2013-04-22 22:47:32

+0

謝謝。你幫了我很多。 – 2013-04-23 11:22:54

相關問題