两个依赖链OSGI

时间:2016-11-24 11:09:21

标签: java hibernate jpa osgi apache-servicemix

我有以下错误:

enter image description here

in text:

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-jpa imports包``javax.persistence,它可以通过两个链获得,我明白了

我不明白的是:

  • 我的捆绑包导入范围version>=2.1.0

  • org.hibernate.proxy(version>=1.0.0)(!(version>=2.0.0)))范围内导入,因此应该没有问题

  • 我的捆绑导入org.hibernate.proxy

所以应该没有问题,因为我的捆绑包所需的版本与org.hibernate.proxy所需的版本不同

或者我错了?

2 个答案:

答案 0 :(得分:2)

问题是

  • demo-persistence-jpa同时需要javax.persistenceorg.hibernate.proxy
  • hibernate bundle exports org.hibernate.proxy
  • hibernate bundle声明它uses:=javax.persistence

对于解析器,这意味着无论谁使用来自hibernate bundle的包都必须连接到提供hibernate bundle连接的javax.persistence的完全相同的bundle / classloader。

如果运行时没有确保并且每个都连接到不同的bundle / classloder,那么当hibernate bundle中的某些东西从ClassCastException返回一个对象时,你会得到javax.persistence因为它将来自不同的类加载器。

在上面的例子中,解析器无法确保因为hibernate bundle需要javax.persistence版本低于2.0而demo-persistence-jpa需要版本高于2.1!

解决方案是:

  • 使用较新版本的hibernate(假设有一个)与javax.persistence> = 2.1
  • 一起使用
  • make demo-persistence-jpa import javax.persistence< 2.1

答案 1 :(得分:0)

我认为问题在于您有两个捆绑包提供两个不同版本的规范。这不行。你必须确保只能使用一个jpa规范包。

如何安装hibernate和自己的捆绑包?如果您使用Apache karaf功能进行休眠,它应该可以工作。