View on GitHub

blog

Как работают номера версий в Maven

Схема управления версиями Maven использует следующие стандарты:

Например

Все версии с квалификатором старше той же версии без квалификатора (версия выпуска)

Пример

1.2-beta-2 старше 1.2

Идентичные версии с разными полями квалификаторов сравниваются с помощью базового сравнения строк.

Пример

1.2-beta-2 новее, чем 1.2-alpha-6.

Если вы не следуете стандартам управления версиями Maven в схеме управления версиями проекта, то для сравнения версий Maven интерпретирует всю версию как простую строку.

Maven и его основные плагины используют сравнение версий для ряда задач, в первую очередь для процесса выпуска.

Если вы используете нестандартную схему управления версиями, цели модуля Maven по выпуску и версии могут не дать ожидаемых результатов.

Поскольку базовое сравнение строк выполняется для нестандартных версий, сравнение версий в некоторых случаях вычисляет порядок версий неправильно.

Например, Maven упорядочивает список версий следующим образом:

1.0.1.0
1.0.10.1
1.0.10.2
1.0.9.3

Версия 1.0.9.3 должна быть раньше 1.0.10.1 и 1.0.10.2 , но неожиданное четвертое поле (.3) заставило Maven оценить версию как строку.

Пример этого эффекта для Maven можно найти в подключаемом модуле Maven Versions. Подключаемый модуль Maven Versions позволяет различными способами проверять зависимости вашего проекта.

Одна полезная функция плагина - цель (goal) versions:dependency-updates-report. Цель versions:dependency-updates-report исследует иерархию зависимостей проекта и сообщает, для каких из них доступны более новые выпуски.

Когда вы координируете большой выпуск, эта цель может помочь вам найти устаревшие ссылки в конфигурации зависимостей.

Если Maven неправильно определяет более новую версию, то это также неверно сообщается в подключаемом модуле.

Учитывая предыдущую последовательность примеров, если ваша текущая ссылка была 1.0.10.2, тогда плагин сообщит 1.0.9.3 как более новый выпуск.

Квалификатор SNAPSHOT

Maven трактует квалификатор SNAPSHOT иначе, чем все остальные. Если за номером версии следует -SNAPSHOT, Maven считает ее «еще не выпущенной» версией (MajorVersion, MinorVersion или IncrementalVersion) артифакта.

В среде непрерывной интеграции версия SNAPSHOT играет жизненно важную роль в поддержании актуальности сборки интеграции при минимизации количества сборок, необходимых для каждого шага интеграции.

Ссылки на версии SNAPSHOT позволяют Maven извлекать последний развернутый экземпляр зависимости SNAPSHOT во время сборки зависимого проекта.

Обратите внимание, что SNAPSHOT постоянно меняется. Каждый раз, когда агент развертывает артефакт, он обновляется в общем репозитории.

Зависимость SNAPSHOT обновляется на компьютере разработчика или обновляется при каждой сборке. Это гарантирует, что зависимости обновляются и интегрируются с последними изменениями без необходимости вносить изменения в эталонную конфигурацию зависимостей проекта.

Обычно в репозитории артефактов хранится только последний развернутый снимок SNAPSHOT для конкретной версии артефакта.

Хотя репозиторий можно настроить для поддержки скользящего архива с несколькими самыми последними развертываниями данного артефакта, более старые экземпляры обычно используются только для устранения неполадок и не играют роли в интеграции.

Серверы непрерывной сборки, которые включают возможность определять и выполнять задание на основе проекта Maven, например Hudson (Jenkins), могут быть настроены для распознавания, когда артефакт SNAPSHOT обновился, а затем перестраивают проекты, которые зависят от обновленного артефакта.

Например, конфигурация сборки Hudson (Jenkins), которая сопоставляется с объектной моделью проекта Maven, имеет зависимость SNAPSHOT. Jenkins периодически проверяет репозиторий артефактов на наличие обновлений SNAPSHOT.

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

Ссылки на диапазоны версий

Maven позволяет вам указать диапазон версий, которые можно использовать в качестве зависимостей. Таблица показывает диапазон технических характеристик версии.

Диапазон Значение
(,1.0] x <= 1.0
` 1.0` Обычно это означает 1.0 или более позднюю версию, если 1.0 недоступна.

Различные плагины Maven могут интерпретировать это по-разному, поэтому безопаснее использовать один из других, более конкретных вариантов.
[1.0] Ровно 1.0
[1.2,1.3] 1.2 <= x <= 1.3
[1.0,2.0) 1.0 <= x < 2.0
[1.5,) x >= 1.5
(,1.0],[1.2,) x <= 1.0 or x >= 1.2.

Несколько наборов разделяются запятой.
(,1.1),(1.1,) Сюда не входит 1.1, если известно, что он не работает в сочетании с библиотекой.

Когда Maven обнаруживает несколько совпадений для ссылки на версию, он использует версию с наивысшим соответствием.

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

Это позволяет Maven выбрать наиболее подходящую версию в случаях, когда зависимость указана в разных точках транзитивного графа зависимостей с разными версиями.

Когда возникает подобный конфликт, Maven выбирает самую высокую версию из всех ссылок.

Имея возможность использовать диапазоны версий, вы можете задаться вопросом, есть ли еще полезность в использовании версий SNAPSHOT.

Хотя вы можете достичь некоторых из тех же результатов, используя выражение диапазона версий, SNAPSHOT лучше работает в системе непрерывной сборки по следующим причинам:

Номера версий в координатах Maven

Номер версии артефакта, определенный в файле POM, совпадает с номером версии выпущенного продукта (артифакта). например, 12.1.2.0.0, выраженный пятью цифрами, как описано далее: x.x.x-y-z.

Диапазоны номеров версий в зависимостях

Два важных сценария, в которых указаны зависимости от артефактов Maven, предоставляемых Oracle, следующие:

Диапазон номеров версий должен быть указан в обоих сценариях. В этом разделе описывается, как диапазоны номеров версий указываются в артефактах, предоставленных Oracle, и когда вы объявляете зависимость от артефактов, предоставленных Oracle.

При указании зависимостей от других артефактов следует использовать наиболее точный правильный синтаксис, чтобы гарантировать, что определение не позволяет использовать неправильную или неподходящую версию зависимости.

[x.x.x, y.y.y)

Пример правильного способа указания зависимости выглядит следующим образом:

[12.1.2,12.1.3)

Как показано в таблице, предыдущий пример означает, что последняя доступная версия - 12.1.2 или выше, но меньше 12.1.3.

Схема номеров версий, используемая предоставленными Oracle артефактами, обеспечивает правильную сортировку номеров версий, например, Maven разрешит следующие версии в указанном порядке (от самых старых к новейшим).

12.1.2-0-0, 
12.1.2-0-1, 
12.1.2-0-2, 
12.1.2-0-10, 
12.1.2-1-0, 
12.1.2-1-1, 
12.1.2-1-2, 
12.1.2-1-10, 
12.1.2-0-0, 
12.1.3-0-0

Если необходимо указать зависимость, которая зависит от определенного PatchSet или Bundle Patch, например, когда вводится новый API, вы должны включить четвертую, четвертую и пятую цифры соответственно.

Например

[12.1.2-2,12.1.3)      зависит от 12.1.2 с PatchSet 2
[12.1.2-2-5,12.1.3)    зависит от 12.1.2 с PatchSet 2 и Bundle Patch 5

Оригинал