2016-11-24 111 views
1

我有以下錯誤:兩個依賴鏈OSGI

enter image description here

文本

Error executing command: Error restarting bundles: 
    Unable to start bundle 278: Uses constraint violation. Unable to resolve resource demo-persistence-jpa [demo-persistence-jpa [278](R 278.0)] because it is exposed to package 'javax.persistence' from resources javax.persistence [javax.persistence [248](R 248.0)] and org.apache.geronimo.specs.geronimo-jpa_2.0_spec [org.apache.geronimo.specs.geronimo-jpa_2.0_spec [266](R 266.0)] via two dependency chains. 

Chain 1: 
demo-persistence-jpa [demo-persistence-jpa [278](R 278.0)] 

import: (&(osgi.wiring.package=javax.persistence)(version>=2.1.0)) 
| 
export: osgi.wiring.package: javax.persistence 
javax.persistence [javax.persistence [248](R 248.0)] 
Chain 2: 
demo-persistence-jpa [demo-persistence-jpa [278](R 278.0)] 
import: (osgi.wiring.package=org.hibernate.proxy) 
| 
export: osgi.wiring.package=org.hibernate.proxy; uses:=javax.persistence 
com.springsource.org.hibernate [com.springsource.org.hibernate [230](R 230.0)] 
    import: (&(osgi.wiring.package=javax.persistence)(version>=1.0.0)(!(version>=2.0.0))) 
| 
export: osgi.wiring.package: javax.persistence 
org.apache.geronimo.specs.geronimo-jpa_2.0_spec [org.apache.geronimo.specs.geronimo-jpa_2.0_spec [266](R 266.0)] Unresolved requirements: [[demo-persistence-jpa [278](R 278.0)] osgi.wiring.package; (osgi.wiring.package=org.hibernate.proxy)] 

正如你所看到的問題是我的包demo-persistence-jpaimports包`javax.persistence這是通過兩條鏈可用,這我明白

我不明白:

01範圍內 version>=2.1.0

  • org.hibernate.proxy進口範圍(version>=1.0.0)(!(version>=2.0.0)))

    • 我的包進口,所以應該沒有問題

    • 我捆進口org.hibernate.proxy

    ,所以應該沒問題,因爲我的包所需的版本與一個請求不一樣紅由org.hibernate.proxy

    還是我誤會?

  • +2

    能否請您複製/粘貼錯誤的內容,而不是提供一個(非可讀)屏幕截圖? –

    +0

    我剛剛添加它在文本中,你可以點擊圖片,它更清晰,雖然 – isco

    回答

    2

    問題是

    • demo-persistence-jpa需求都javax.persistenceorg.hibernate.proxy
    • 休眠束出口org.hibernate.proxy
    • 休眠束指出它uses:=javax.persistence

    的解析器,這意味着誰使用包從休眠狀態包必須被連接到完全相同的包/類加載器提供javax.persistence是冬眠束是連線到。

    如果運行時不保證每個連接到不同的bundle/classloders,你會得到ClassCastException從hibernate bundle返回一個對象javax.persistence,因爲它將來自不同的類加載器。

    在上面的例子中,解析器不能確保因爲hibernate包需要javax.persistence版本低於2.0,並且demo-persistence-jpa需要版本高於2.1!

    的解決方案是:

    • 使用較新版本的休眠(假設有一個),其與javax.persistence> = 2的工作原理。1
    • 使demo-persistence-jpa進口javax.persistence < 2.1
    0

    我認爲問題在於你有兩個捆綁包提供兩種不同版本的規格。這不起作用。你必須確保你只需要一個jpa規範捆綁。

    你如何安裝hibernate和你自己的包?如果你使用Apache karaf特性進行休眠,它應該可以工作。

    +0

    我們不應該能夠同時有兩個不同的版本(或更多)? 這裏是安裝了所有包的列表: http://pastebin.com/raw/Y92CtFJa 順便說一句,我試圖按照你的教程 http://www.liquid-reality.de/display/liquid/2012/01/13/Apache + Karaf + Tutorial + Part + 6 + - + Database + Access – isco

    +0

    是的,假設不相交的類空間。但是,如果使用約束(如@ milen-dyankov所述),則不存在不相交的類空間。 –