当我尝试在OSGi容器中安装捆绑软件时看到此错误:
Error executing command: Uses constraint violation. Unable to resolve resource com.example.myproject [com.example.myproject/5.0.0.SNAPSHOT] because it is exposed to package 'javax.jms' from resources com.example.resource1 [com.example.resource1/2.0.1] and com.example.resource2 [com.example.resource2/1.1.1] via two dependency chains.
Chain 1:
com.example.myproject [com.example.myproject/5.0.0.SNAPSHOT]
import: (&(osgi.wiring.package=javax.jms)(version>=2.0.0)(!(version>=3.0.0)))
|
export: osgi.wiring.package: javax.jms
com.example.resource1 [com.example.resource1/2.0.1]
Chain 2:
com.example.myproject [com.example.myproject/5.0.0.SNAPSHOT]
import: (&(osgi.wiring.package=com.example.intermediary)(version>=7.2.0)(!(version>=8.0.0)))
|
export: osgi.wiring.package=com.example.intermediary; uses:=javax.jms
com.example.intermediary [com.example.intermediary/7.2.0]
import: (&(osgi.wiring.package=javax.jms)(version>=1.1.0)(!(version>=3.0.0)))
|
export: osgi.wiring.package: javax.jms
com.example.resource2 [com.example.resource2/1.1.1]
据我所知,com.example.resource1导出的软件包版本可以满足这两个链条。那么为什么不在两个地方都只使用resource1呢?
答案 0 :(得分:1)
这将行不通,因为不能保证从javax.jms
加载类只会在捆绑包com.example.resource1
(导出包的唯一有效版本)时结束。因此,在捆绑软件的某个“接线”状态(它在运行时以传递方式导入的每个已解析软件包)中,绝对不应存在不同版本的软件包。
这称为类空间一致性,在OSGi Core 7 - 3.7.6 Package Constraints中定义。
一旦核心JVM学会了区分不同版本中的类,就不再需要此限制-只要可以明确后果是可以控制它。