Как работают номера версий в Maven
Схема управления версиями Maven использует следующие стандарты:
- MajorVersion
- MinorVersion
- IncrementalVersion
- BuildNumber
- Qualifier
Например
- MajorVersion:
1.2.1
- MinorVersion:
2.0
- IncrementalVersion:
1.2-SNAPSHOT
- BuildNumber:
1.4.2-12
- Qualifier:
1.2-beta-2
Все версии с квалификатором старше той же версии без квалификатора (версия выпуска)
Пример
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 работают со снимками SNAPSHOT более эффективно,
чем диапазоны следующих версий.
Поскольку один артефакт можно развернуть несколько раз в день, количество уникальных экземпляров, поддерживаемых репозиторием, может очень быстро увеличиваться. - Non-SNAPSHOT release, предназначены для поддержки неограниченное время.
Если вы постоянно выпускаете новую версию и увеличиваете номер сборки или версию,
требования к хранилищу могут быстро стать неуправляемыми.
Менеджеры репозиториев предназначены для удаления старых снимков SNAPSHOT, чтобы освободить место для новых экземпляров, поэтому объем требуемого хранилища остается постоянным. - Снимки SNAPSHOT также распознаются процессом сборки Maven, что дает вам некоторые преимущества при выполнении release сборки.
Номера версий в координатах Maven
Номер версии артефакта, определенный в файле POM,
совпадает с номером версии выпущенного продукта (артифакта).
например, 12.1.2.0.0
, выраженный пятью цифрами, как описано далее: x.x.x-y-z
.
x.x.x
- номер версии выпуска, например 12.1.2.y
- номер PatchSet, например0,1,2,3,…
без начальных нулейz
- номер Bundle Patch, например0,1,2,3,…
без начальных нулей- Точки и дефисы являются литералами
Диапазоны номеров версий в зависимостях
Два важных сценария, в которых указаны зависимости от артефактов Maven, предоставляемых Oracle, следующие:
- Внутри POM-файлов артефактов, которые являются частью продукта Oracle
- Внутри файлов POM, которые вы включаете в свои собственные проекты
Диапазон номеров версий должен быть указан в обоих сценариях. В этом разделе описывается, как диапазоны номеров версий указываются в артефактах, предоставленных Oracle, и когда вы объявляете зависимость от артефактов, предоставленных Oracle.
При указании зависимостей от других артефактов следует использовать наиболее точный правильный синтаксис, чтобы гарантировать, что определение не позволяет использовать неправильную или неподходящую версию зависимости.
[x.x.x, y.y.y)
x.x.x
- номер версии выпуска, например12.1.2
.y.y.y
- это следующий возможный номер версии выпуска, например,12.1.3
.- Скобки, точки, команды и круглые скобки являются литералами
Пример правильного способа указания зависимости выглядит следующим образом:
[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