OSGi `использует` нарушение ограничений, даже если существуют совместимые экспортеры - PullRequest
0 голосов
/ 15 мая 2019

Я вижу эту ошибку при попытке установить пакет в моем контейнере 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 Ответ

1 голос
/ 16 мая 2019

Это не будет работать, потому что нет никакой гарантии, что при загрузке класса из javax.jms он окажется только в пакете com.example.resource1 (который экспортирует единственную действительную версию пакета).Таким образом, в определенном «проводном» состоянии пакета (каждый разрешенный пакет, который он импортирует во время выполнения, транзитивно) никогда не должно быть пакетов в разных версиях.

Это называется Согласованность пространства классов и определено в OSGi Core 7 - 3.7.6 Ограничения пакета .

Как только базовая JVM научится различать классы в разных версиях, это ограничение может больше не понадобиться - до тех пор, покапоследствия проясняются, есть контроль над этим.

...