В OSGi процесс разрешения определенных зависимостей, то есть импорта и экспорта пакетов, довольно строг при использовании номеров версий и диапазонов версий. Если для некоторого пакета импорта версии 1.2.3 не найден соответствующий экспорт с диапазоном, содержащим 1.2.3, пакет не может быть разрешен или запущен. Это хорошо.
Однако это не относится к основному пакету org.osgi.framework
. Текущие версии Equinox (3.8.0) и Apache Felix (4.0.3) определяют org.osgi.framework,version=1.7.0
как один из экспортируемых пакетов. Но пакет, требующий конкретной более низкой версии этого пакета, например. Import-Package: org.osgi.framework;version=1.3
, все еще разрешается это для этой более новой версии. Я ожидаю, что пакет не будет решен.
Как можно объяснить такое поведение? Является ли это неправильным поведением реализаций OSGi? Я пропустил исключение при разрешении основных пакетов OSGi? Или здесь Караф мешает (я тестировал это с помощью Apache Karaf, см. ниже)
Я знаю, что я бы предпочел не объявлять версию явно и что версия привела бы к совершенно разрешимому диапазону. Однако есть неподконтрольные мне пакеты, определяющие такой импорт (а именно: iPOJO, см. ниже).
Некоторые детали настройки: я тестировал это в Karaf 2.3.2 и 2.3.3 с включенными Equinox или Felix соответственно. Вы можете найти демонстрационный пакет, который я использовал для тестов, на github, который может быть собранным как есть и покажет сбой при развертывании в новом контейнере Karaf. Причина, по которой я это обнаружил, заключается в том, что ядро iPOJO bundle определяет такие явные версии, а не диапазоны. Я добавил это в дескриптор функции Karaf и попытался проверить целостность экспорта/импорта функции с помощью Karaf Features Maven Plugin, который не работает.