【问题标题】:two dependency chains OSGI两个依赖链 OSGI
【发布时间】:2017-04-08 15:59:28
【问题描述】:

我有以下错误:

在文本中:

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,它可以通过两个链获得,我理解

我不明白的:

  • 我的包在version>=2.1.0范围内导入

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

  • 我的包导入org.hibernate.proxy

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

还是我弄错了?

【问题讨论】:

  • 能否请您复制/粘贴错误内容而不是提供(不可读的)屏幕截图?
  • 我只是在文本中添加了它,您可以单击图像,但它更清晰

标签: java hibernate jpa osgi apache-servicemix


【解决方案1】:

问题是

  • demo-persistence-jpa 需要 javax.persistenceorg.hibernate.proxy
  • 休眠包导出org.hibernate.proxy
  • 休眠包声明它uses:=javax.persistence

对于解析器,这意味着无论谁使用 hibernate 包中的包,都必须连接到完全相同的包/类加载器,提供 javax.persistence 连接到该 hibernate 包。

如果运行时不能确保每个都连接到不同的捆绑包/类加载器,那么当来自休眠捆绑包的某些内容返回您来自javax.persistence 的对象时,您将得到ClassCastException,因为它将来自不同的类加载器。

在上述情况下,解析器无法确保因为 hibernate bundle 需要 javax.persistence 版本低于 2.0 而demo-persistence-jpa 需要版本高于 2.1!

解决方案是:

  • 使用适用于javax.persistence >= 2.1 的更新版本的休眠(假设有)
  • 制作demo-persistence-jpa导入javax.persistence

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 难道我们不应该能够同时拥有两个不同的版本(或更多)吗?这是已安装的所有捆绑包的列表:pastebin.com/raw/Y92CtFJa btw,我正在尝试按照您的教程进行操作 liquid-reality.de/display/liquid/2012/01/13/…
    • 是的,假设类空间不相交。但是使用 uses 约束(如 @milen-dyankov 所述),您没有不相交的类空间。
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2014-12-20
    • 2014-10-02
    • 2017-07-28
    • 2013-02-01
    • 2021-09-13
    相关资源
    最近更新 更多