Я работаю над Project Dash, в частности над набором инструментов для импорта пакетов Eclipse (например, org.eclipse.swt.gtk.linux.x86_64_3.6.2.v3659b.jar
) в репозиторий Maven 2. Мы запустили инструменты на выходных и вот результат: тестируемый репозиторий Maven 2, содержащий большую часть Eclipse 3.6.2 .
Во время преобразования мы столкнулись с проблемой без простого решения: большинство пакетов Eclipse либо не запрашивают конкретную версию, либо запрашивают диапазон версий . Итак, у нас есть оба:
Require-Bundle: org.eclipse.core.runtime
и
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)"
Во время преобразования инструменты собирают все версии всех комплектов, и если нам нужно написать POM для верхнего примера, мы выписываем собранную нами версию (в данном примере это 3.6.2). В нижнем регистре мы оставляем диапазон версий в покое. Пока проблем нет.
Теперь выходит новая версия, скажем, 3.7. Когда мы конвертируем это, создается новая версия 3.7.0 первого POM, и она получает зависимость к org.eclipse.core:org.eclipse.core.runtime:3.7.0
, а вторая создается с тем же диапазоном версий, что и раньше.
Примечание. Теперь у нас есть четыре POM (два для 3.6.2 и два для 3.7). Один зависит от core.runtime 3.6.2, один на 3.7.0 и два имеют диапазон версий [3.2.0,4.0.0)
Это опубликовано, и вы ничего не меняете на своей стороне. Вы не обновляетесь до 3.7.0 !
Теперь у нас есть проблема: если вы используете эти два артефакта с версией 3.6.2 в своей сборке, то первый будет по-прежнему использовать ядро времени выполнения 3.6.2, так как его версия заблокирована.
Но второй обновит метаданные Maven и увидит «о, у нас тоже есть 3,7 для этого», скачайте их и взорвитесь, в итоге вы получите org.eclipse.core:org.eclipse.core.runtime:3.7
и org.eclipse.core:org.eclipse.core.runtime:3.6.2
в вашем classpath без каких-либо изменений на вашей стороне .
Это плохо. Как мы должны решить это?