即使存在兼容的出口商,OSGi仍会使用“约束”,

时间:2019-05-15 18:56:32

标签: java osgi apache-karaf apache-felix osgi-bundle

当我尝试在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呢?

1 个答案:

答案 0 :(得分:1)

这将行不通,因为不能保证从javax.jms加载类只会在捆绑包com.example.resource1(导出包的唯一有效版本)时结束。因此,在捆绑软件的某个“接线”状态(它在运行时以传递方式导入的每个已解析软件包)中,绝对不应存在不同版本的软件包。

这称为类空间一致性,在OSGi Core 7 - 3.7.6 Package Constraints中定义。

一旦核心JVM学会了区分不同版本中的类,就不再需要此限制-只要可以明确后果是可以控制它。