Могу ли я использовать квалификаторы версий, чтобы требовать определенные версии пакетов в OSGi?

У меня есть сторонний JAR, который я хочу обернуть - у него нет собственного манифеста OSGi. Например, org.myproject. Поэтому я создаю оболочку пакета.

Это прекрасно работает - я предоставляю версию для выпуска org.myproject. Это продиктовано авторами org.myproject. Скажем, 1.0.1.

Теперь org.myproject изменено, и я хочу включить изменения. Однако официального релиза для этого нет. Похоже, я мог бы использовать квалификатор для представления более новой версии: 1.0.1.$timestamp

Однако при создании оболочки JAR с помощью bndtools экспорт пакета по-прежнему имеет версию 1.0.1.

Можно ли экспортировать, а затем импортировать в OSGi версию пакета для конкретного квалификатора? Каков наилучший способ управления этим в bndtools?


person Dan Gravell    schedule 18.02.2016    source источник
comment
Если org.myproject изменился, почему это не просто скачок версии для вашего упакованного пакета? Ведь завернутое содержимое изменилось.   -  person BJ Hargrave    schedule 19.02.2016
comment
Что ж, если я назову его 1.0.2, а затем авторы org.myproject внесут некоторые изменения в дополнение к тем, которые я уже включил, и назовут это 1.0.2, мы немного запутаемся, не так ли? Если я хочу обернуть их новую версию, какой версией я ее назову?   -  person Dan Gravell    schedule 19.02.2016
comment
Может быть, мое мнение о том, что версия пакета должна отражать обернутую версию JAR, неверно?   -  person Dan Gravell    schedule 19.02.2016
comment
Итак, вы изначально обернули 1.0.1 org.myproject и назвали свой пакет 1.0.1. Затем org.myproject изменился, но не увеличил версию как минимум до 1.0.2? Тогда у вас возникнут проблемы с попыткой обернуть семантические версии вокруг проектов, которые не имеют семантической версии. :-(   -  person BJ Hargrave    schedule 19.02.2016
comment
Ага! ;-) Вернемся к сути - можно ли использовать квалификаторы в этом случае, и если да, то как я могу получить bnd или bndtools для создания операторов экспорта с ними?   -  person Dan Gravell    schedule 22.02.2016


Ответы (1)


О какой версии идет речь? Если вы используете версию пакета в bnd с 1.2.3.XXXXX, то это версия пакета, которую вы получите при экспорте.

Однако по умолчанию bnd удаляет квалификатор при создании диапазона импорта на основе экспорта. Вы должны иметь возможность переопределить это с помощью политики версий. Значения по умолчанию:

-provider-policy    = ${range;[==,=+)}
-consumer-policy    = ${range;[==,=+)}

Вы можете легко изменить их, включив квалификатор.

Однако это было бы глобальным изменением, и я ожидаю, что вы пожалеете об этом.

Итак, другое решение - изменить импорт этого плохого пакета:

Import-Package org.myproject;version="${range;[====.=+);${@}}", *

Конечно, самое простое решение — покончить с этим и признать, что нанесение губной помады на свинью не делает ее семантически версионной. Просто отделите версию от ВАШЕГО пакета с помощью зависимости. В этих случаях я обычно выбираю странный старший номер, например. 100, чтобы было ясно, что моя версия НЕ является целевой версией.

Поскольку у меня остались неприятные воспоминания об этих проектах, я также могу посоветовать вам взглянуть на контракты OSGi. С контрактами вы не версионируете пакеты, но используете требование контракта.

И наконец, последний и, безусловно, лучший вопрос: действительно ли вам нужно, чтобы этот проект был версионирован? Я считаю, что в большинстве случаев более чем целесообразно разработать собственный OSGi API, отражающий мою потребность в этой внешней цели. Затем я могу оставить этот пакет красиво спрятанным в темном месте, где он, вероятно, должен пострадать из-за отсутствия семантической версии :-)

person Peter Kriens    schedule 29.02.2016
comment
Спасибо, Питер. Я думаю, что просто справлюсь с этим - похоже, что я делаю неправильную вещь, пытаясь связать версии в любом случае. - person Dan Gravell; 29.02.2016