两个依赖链 OSGI
two dependency chains OSGI
我有以下错误:
在文本中:
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
需要的版本不一样
还是我弄错了?
我认为问题在于您有两个捆绑包提供两个不同版本的规范。这是行不通的。您必须确保您可以只使用一个 jpa 规范包。
你如何安装休眠和你自己的包?如果您将 Apache karaf 功能用于休眠,它应该可以工作。
问题是
demo-persistence-jpa
需要 javax.persistence
和 org.hibernate.proxy
。
- hibernate 包导出
org.hibernate.proxy
- hibernate bundle 声明它
uses:=javax.persistence
对于解析器,这意味着无论谁使用休眠包中的包,都必须连接到完全相同的 bundle/classloader,前提是 javax.persistence
休眠包连接到。
如果运行时不能确保每个运行时都连接到不同的 bundles/classloders 你会得到 ClassCastException
从休眠包 returns 你的对象来自 [=11] =] 因为它将来自不同的类加载器。
在上面的例子中,解析器无法保证,因为hibernate bundle需要javax.persistence
版本低于2.0,而demo-persistence-jpa
需要版本高于2.1!
解决方案是:
- 使用适用于
javax.persistence
>= 2.1 的较新版本的 hibernate(假设有一个)
- 制作
demo-persistence-jpa
导入 javax.persistence
< 2.1
我有以下错误:
在文本中:
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
还是我弄错了?
我认为问题在于您有两个捆绑包提供两个不同版本的规范。这是行不通的。您必须确保您可以只使用一个 jpa 规范包。
你如何安装休眠和你自己的包?如果您将 Apache karaf 功能用于休眠,它应该可以工作。
问题是
demo-persistence-jpa
需要javax.persistence
和org.hibernate.proxy
。- hibernate 包导出
org.hibernate.proxy
- hibernate bundle 声明它
uses:=javax.persistence
对于解析器,这意味着无论谁使用休眠包中的包,都必须连接到完全相同的 bundle/classloader,前提是 javax.persistence
休眠包连接到。
如果运行时不能确保每个运行时都连接到不同的 bundles/classloders 你会得到 ClassCastException
从休眠包 returns 你的对象来自 [=11] =] 因为它将来自不同的类加载器。
在上面的例子中,解析器无法保证,因为hibernate bundle需要javax.persistence
版本低于2.0,而demo-persistence-jpa
需要版本高于2.1!
解决方案是:
- 使用适用于
javax.persistence
>= 2.1 的较新版本的 hibernate(假设有一个)
- 制作
demo-persistence-jpa
导入javax.persistence
< 2.1