两个依赖链 OSGI

isc*_*sco 5 java osgi hibernate jpa apache-servicemix

我有以下错误:

在此输入图像描述

在文本中:

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)]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,问题是我的包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

还是我错了?

Mil*_*kov 5

问题是

  • demo-persistence-jpa需要javax.persistenceorg.hibernate.proxy
  • 休眠捆绑导出org.hibernate.proxy
  • hibernate 包声明了这一点uses:=javax.persistence

对于解析器来说,这意味着使用 hibernate 包中的包的任何人都必须连接到完全相同的包/类加载器,前提是javax.persistence连接到了 hibernate 包。

如果运行时不能确保这一点,并且每个都连接到不同的包/类加载器,那么您会得到ClassCastExceptionhibernate 包中的某些内容返回给您的对象javax.persistence,因为它将来自不同的类加载器。

在上面的情况下,解析器无法确保,因为hibernate包需要javax.persistence版本低于2.0并且demo-persistence-jpa需​​要版本高于2.1!

解决方案是:

  • javax.persistence使用适用于>= 2.1的较新版本的 hibernate(假设有一个)
  • 使demo-persistence-jpa导入javax.persistence<2.1