У меня есть небольшой пакет, который использует Groovy для интерпретации скриптов.
Инструкция Import-Package выглядит так:
Import-Package: groovy.util;version="[1.8,2)"
В приведенном выше диапазоне версий указано, что версия импорта должна быть между 1.8 (включительно) и 2.0 (эксклюзивно).
Когда я запускаю этот пакет в среде OSGi с установленным только Groovy 1.8.6, он работает как ожидалось... когда я набираю inspect package requirement 4
, он печатает:
-> com.athaydes.gradle.osgi.groovy-1-8-6-runner [4] imports packages:
------------------------------------------------------------------
ipojo.example.code; version=0.0.0 -> com.athaydes.gradle.osgi.code-runner-api [1]
groovy.util; version=1.8.6 -> groovy-all [5]
Это точно так, как я ожидал, и когда я прошу CodeRunner интерпретировать этот Groovy фрагмент:
GroovySystem.version
Он правильно возвращает 1.8.6
.
Теперь, когда я запускаю среду OSGi с установленными Groovy 1.8.6 и 2.3.3, когда я проверяю пакеты для своего пакета, я получаю это вместо:
-> com.athaydes.gradle.osgi.groovy-1-8-6-runner [4] imports packages:
------------------------------------------------------------------
ipojo.example.code; version=0.0.0 -> com.athaydes.gradle.osgi.code-runner-api [1]
Импорт groovy.util
ушел (хотя, конечно, MANIFEST его, конечно)! И теперь, когда я запускаю GroovySystem.version
, я получаю 2.3.3, а не 1.8.6, как и должно быть!
Это сумасшедший материал, похоже, только тот факт, что присутствует более новая версия Groovy, нарушает обещание OSGi, что я должен использовать любую версию зависимости, которую я хочу.
Я тестировал это в Felix и Equinox с точно таким же результатом.
Я также использовал точную версию в манифесте вместо диапазона, но это ничего не меняло.
Может ли кто-нибудь увидеть, что именно происходит здесь?
PS. если вы мне не верите, попробуйте сами, вот проект на GitHub: https://github.com/renatoathaydes/osgi-run/tree/next/osgi-run-test/ipojo-dosgi