2016-11-24 69 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所述),则不存在不相交的类空间。 –