Как я могу сказать Maven использовать последнюю версию зависимости?
в Maven зависимости обычно настраиваются следующим образом:
<dependency>
<groupId>wonderful-inc</groupId>
<artifactId>dream-library</artifactId>
<version>1.2.3</version>
</dependency>
теперь, если вы работаете с библиотеками, которые имеют частые выпуски, постоянное обновление тега может быть несколько раздражающим. Есть ли способ сказать Maven всегда использовать последнюю доступную версию (из репозитория)?
12 ответов:
Примечание:
этот ответ относится только к Maven 2! Упомянутое
LATEST
иRELEASE
metaversions были сброшены в Maven 3 "ради воспроизводимых сборок", около 6 лет назад. Пожалуйста, обратитесь к этому Maven 3 совместимое решение.
если вы всегда хотите использовать самую новую версию, Maven имеет два ключевых слова, которые вы можете использовать в качестве альтернативы диапазоны версий. Вы должны использовать эти параметры с осторожностью, поскольку вы больше не контролируете Плагины/зависимости, которые вы используете.
когда вы зависите от плагина или зависимости, вы можете использовать значение версии LATEST или RELEASE. Последнее относится к последней выпущенной или моментальной версии определенного артефакта, самого последнего развернутого артефакта в определенном репозитории. Выпуск относится к последнему выпуску без моментального снимка в репозитории. В общем, это не рекомендуется разрабатывать программное обеспечение, которое зависит от неспецифической версии артефакта. Если вы разрабатываете программное обеспечение, вы можете использовать RELEASE или LATEST для удобства, чтобы вам не приходилось обновлять номера версий при выпуске нового выпуска сторонней библиотеки. Когда вы выпускаете программное обеспечение, вы всегда должны убедиться, что ваш проект зависит от конкретных версий, чтобы уменьшить вероятность того, что ваша сборка или ваш проект будут затронуты выпуском программного обеспечения, который не находится под вашим контролем. Используйте последнюю версию и выпускайте с осторожностью, если вообще.
посмотреть раздел синтаксиса POM книги Maven для более подробной информации. Или посмотреть этот документ на Диапазоны Версий Зависимостей, где:
- квадратная скобка (
[
&]
) означает "закрыто" (включительно).- скобки (
(
&)
) означает "открыто" (эксклюзив).вот пример, иллюстрирующий различные варианты. В хранилище Maven, com.foo: my-foo имеет следующие метаданные:
<?xml version="1.0" encoding="UTF-8"?><metadata> <groupId>com.foo</groupId> <artifactId>my-foo</artifactId> <version>2.0.0</version> <versioning> <release>1.1.1</release> <versions> <version>1.0</version> <version>1.0.1</version> <version>1.1</version> <version>1.1.1</version> <version>2.0.0</version> </versions> <lastUpdated>20090722140000</lastUpdated> </versioning> </metadata>
если требуется зависимость от этого артефакта, у вас есть следующие параметры (другое версия диапазоны можно указать, конечно, просто показывая соответствующие здесь):
объявить точную версию (всегда будет решать 1.0.1):
<version>[1.0.1]</version>
объявите явную версию (всегда будет разрешаться до 1.0.1, если не произойдет столкновение, когда Maven выберет a соответствующая версия):
<version>1.0.1</version>
объявить диапазон версий для всех 1.x (в настоящее время будет разрешен до 1.1.1):
<version>[1.0.0,2.0.0)</version>
объявите открытый диапазон версий (разрешится до 2.0.0):
<version>[1.0.0,)</version>
объявите версию как последнюю (разрешит до 2.0.0) (удалено из maven 3.x)
<version>LATEST</version>
объявите версию как RELEASE (разрешит 1.1.1) (удалено из maven 3.x):
<version>RELEASE</version>
обратите внимание, что по умолчанию ваши собственные развертывания обновит" последнюю "запись в метаданных Maven, но для обновления записи" release "вам необходимо активировать" release-profile " из Maven super POM. Вы можете сделать это с помощью "- Prelease-profile "или" - DperformRelease=true"
стоит подчеркнуть, что любой подход, который позволяет Maven выбирать версии зависимостей (последние, выпуск и диапазоны версий), может оставить вас открытыми для проблем со временем сборки, поскольку более поздние версии могут иметь другое поведение (например, плагин зависимостей ранее переключил значение по умолчанию с true на false, с запутанными результатами).
поэтому обычно хорошая идея, чтобы определить точные версии в релизах. Как Тим указывает, что maven-версии-плагин - это удобный инструмент для обновления версий зависимостей, в частности версии: использовать-последние-версии и версии: use-latest-releases целей.
теперь я знаю, что эта тема старая, но читая вопрос и ОП поставленный ответ кажется Плагин Maven Versions возможно, на самом деле был лучший ответ на его вопрос:
в частности, могут быть использованы следующие цели:
- версии: использовать-последние-версии поиск pom для всех версий которые были более новой версией и заменяет их самый последний версия.
- версии: use-latest-releases поиск пом для всех не-снимок версии, которые были более новыми отпустите и замените их на последняя версия выпуска.
- версии:обновление-свойства обновляет свойства, определенные в a проект так, чтобы они соответствовали последняя доступная версия конкретные зависимости. Это может быть полезно, если набор зависимостей все должны быть привязаны к одному версия.
также предусмотрены следующие другие цели:
- версии: дисплей-зависимость-обновления сканирует зависимости проекта и производит отчет о тех зависимости, которые имеют более новые доступная версия.
- версии: дисплей-плагин-обновления сканирует Плагины проекта и создает отчет об этих плагинах которые имеют более новые версии доступны.
- версии:обновление-родитель обновляет Родительский раздел проекта так что он ссылается на самые новые имеющиеся версии. Например, если вы используете корпоративный корневой POM, это цель может быть полезна, если вам нужно убедитесь, что вы используете последнюю версия корпоративного корневого POM.
- версии: обновление-дочерние модули обновляет Родительский раздел дочерние модули проекта так что версия соответствует версии текущий проект. Например, если вы есть агрегатор pom, который также является родитель для проектов, которые он агрегаты и дети и родительские версии выходят из синхронизации, это mojo может помочь исправить версии дочерние модули. (Обратите внимание, что вам может потребоваться вызвать Maven с параметром-N в чтобы запустить эту цель, если ваш проект разбит так сильно, что он не удается построить из-за версии mis-match).
- варианты:замок-снимки поиск пом для всех-снимок версии и заменяет их текущая версия метки времени этого - Снимок, например - 20090327.172306-4
- версии:разблокировка-снимки поиск pom для всех меток времени заблокированные версии моментальных снимков и их замена им с собой-снимок.
- варианты:разрешить-диапазоны находит зависимости с использованием диапазонов версий и решает ряд конкретных версия используется.
- версии: use-releases поиск POM для всех версий моментальных снимков которые были выпущены и заменяет их с соответствующими освобождать версия.
- версии: use-next-releases поиск пом для всех не-снимок версии, которые были более новыми отпустите и замените их на следующей версии.
- варианты:использовать-следующей версии поиск pom для всех версий которые были более новой версией и заменяет их на следующую версию.
- версии: commit удаляет pom.XML.файлы versionsBackup. Формы одна половина встроенного устройства - Бедняга ... СКМ."
- версии: revert восстанавливает pom.XML-файлы из ПФЛ.XML.файлы versionsBackup. Формы одна половина встроенного "бедняка СКМ."
просто подумал, что я включу его для любого будущего использования.
пожалуйста, взгляните на на этой странице (раздел "диапазоны версий зависимостей"). То, что вы можете сделать, это что-то вроде
<version>[1.2.3,)</version>
эти диапазоны версий реализованы в Maven2.
В отличие от других я думаю, что есть много причин, почему вы могли бы всегда хочу последние версия. Особенно если вы выполняете непрерывное развертывание (у нас иногда есть как 5 релизов в день) и не хотите делать многомодульный проект.
то, что я делаю, это сделать Хадсон / Дженкинс сделать следующее Для каждой сборки:
mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage="update versions" -DperformRelease=true
то есть я использую плагин versions и плагин scm для обновления зависимостей, а затем возвращаю его в систему управления версиями. Да я позволю моему CI do SCM checkins (что вы должны сделать в любом случае для плагина Maven release).
вы хотите настроить плагин версий, чтобы обновить только то, что вы хотите:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-maven-plugin</artifactId> <version>1.2</version> <configuration> <includesList>com.snaphop</includesList> <generateBackupPoms>false</generateBackupPoms> <allowSnapshots>true</allowSnapshots> </configuration> </plugin>
Я использую плагин выпуска, чтобы сделать выпуск, который заботится о-SNAPSHOT и проверяет, что есть версия выпуска-SNAPSHOT (что важно).
Если вы сделаете то, что я делаю, вы получите последнюю версию для всех сборок моментальных снимков и последнюю версию выпуска для сборок выпуска. Ваш сборки также будут воспроизводимы.
обновление
Я заметил некоторые комментарии, спрашивающие некоторые особенности этого рабочего процесса. Я скажу, что мы больше не используем этот метод, и большая причина, по которой плагин Maven versions является багги и в целом по своей сути ошибочен.
он ошибочен, потому что для запуска плагина версий для настройки версий все существующие версии должны существовать для правильной работы pom. То есть версии плагин не может обновить последняя версия чего-либо, если она не может найти версию, указанную в pom. Это на самом деле довольно раздражает, поскольку мы часто очищаем старые версии по причинам дискового пространства.
На самом деле вам нужен отдельный инструмент от maven для настройки версий (поэтому вы не зависите от файла pom для правильной работы). Я написал такой инструмент на скромном языке, который является Bash. Скрипт обновит версии, такие как плагин версии, и вернет pom обратно в систему управления версиями. Он также работает как 100x быстрее, чем плагин mvn версии. К сожалению, он не написан таким образом для публичного использования, но если люди заинтересованы, я мог бы сделать это так и поместить его в gist или github.
возвращаясь к рабочему процессу, как некоторые комментарии спрашивали о том, что это то, что мы делаем:
- у нас есть 20 или около того проектов в своих собственных репозиториях со своими собственными заданиями Дженкинса
- когда мы выпускаем плагин Maven release используется. Рабочий процесс этого рассматривается в разделе документация плагина. Плагин Maven release вроде отстой (и я добр), но он работает. В один прекрасный день мы планируем заменить этот метод чем-то более оптимальным.
- когда один из проектов будет выпущен Дженкинс затем запускает специальное задание мы будем называть обновление всех версий задания (как Дженкинс знает его релиз является сложным способом отчасти потому, что Maven Дженкинс релиз плагин довольно дерьмовый, а также).
- задание обновить все версии знает обо всех 20 проектов. Это фактически агрегатор pom, чтобы быть конкретным со всеми проектами в разделе модулей в порядке зависимости. Дженкинс запускает наш magic groovy / bash foo, который вытащит все проекты, обновит версии до последней, а затем проверит poms (снова сделано в порядке зависимости на основе раздела модулей).
- для каждого проекта, если pom изменился (из-за изменения версии в некоторой зависимости), он регистрируется, а затем мы немедленно пингуем Дженкинса для запуска соответствующее задание для этого проекта (это необходимо для сохранения порядка зависимостей сборки, иначе вы находитесь во власти планировщика опроса SCM).
На данный момент я считаю, что это хорошая вещь, чтобы релиз и автоматическая версия были отдельным инструментом от вашей общей сборки в любом случае.
теперь вы можете подумать, что maven вроде отстой из-за проблем, перечисленных выше, но на самом деле это было бы довольно сложно с помощью инструмента сборки, который не имеет декларативного простого чтобы разобрать выдвижная синтаксис (он же XML).
фактически мы добавляем пользовательские атрибуты XML через пространства имен, чтобы помочь подсказать сценарии bash/groovy (например, не обновляйте эту версию).
синтаксис зависимостей находится в Спецификация Требований К Версии Зависимостей документация. Вот это для полноты картины:
зависимостей'
version
элемент определяет требования к версии, используемый для вычисления эффективной версии зависимостей. Требования к версии имеют следующий синтаксис:
1.0
:" мягкое " требование на 1.0 (просто рекомендация, если она соответствует всем другим диапазонам для зависимость)[1.0]
:" жесткое " требование на 1.0(,1.0]
: x[1.2,1.3]
: 1.2[1.0,2.0)
: 1.0[1.5,)
: x > = 1.5(,1.0],[1.2,)
: x = 1.2; несколько наборов разделяются запятыми(,1.1),(1.1,)
: это исключает 1.1 (например, если известно не работа в сочетании с этой библиотекой)In вашем случае, вы могли бы сделать что-то вроде
<version>[1.2.3,)</version>
возможно ли, что вы зависите от версий разработки, которые, очевидно, сильно меняются во время разработки?
вместо увеличения версии выпусков разработки вы можете просто использовать версию моментального снимка, которую вы перезаписываете при необходимости, что означает, что вам не придется менять тег версии при каждом незначительном изменении. Что-то вроде 1.0-SNAPSHOT...
но, может быть, вы пытаетесь достичь чего-то другого ;)
кто когда-либо использует последние, пожалуйста, убедитесь, что у вас есть-U в противном случае последний снимок не будет вытащен.
mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST // pull the latest snapshot for my-foo from all repositories
к тому времени, когда этот вопрос был задан, были некоторые перегибы с диапазонами версий в maven, но они были решены в более новых версиях maven. В этой статье очень хорошо показано, как работают диапазоны версий и рекомендации, чтобы лучше понять, как maven понимает версии: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855
правда, даже в 3.x он все еще работает, на удивление проекты строит и развертывает. Но ключевое слово LATEST / RELEASE, вызывающее проблемы в m2e и eclipse повсюду, также зависит от зависимости, которая развернута через последнюю версию/RELEASE, не распознает версию.
Это также вызовет проблему, если вы попытаетесь определить версию как свойство и ссылаться на нее еще где.
таким образом, вывод заключается в использовании версии-maven-plugin если вы можете.
иногда вы не хотите использовать диапазоны версий, потому что кажется, что они "медленны" для разрешения ваших зависимостей, особенно когда есть непрерывная доставка на месте и есть тонны версий - в основном во время тяжелой разработки.
один обходной путь будет использовать версии-maven-plugin. Например, можно объявить свойство:
<properties> <myname.version>1.1.1</myname.version> </properties>
и добавить версии-maven-плагин для вашего POM файла:
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-maven-plugin</artifactId> <version>2.3</version> <configuration> <properties> <property> <name>myname.version</name> <dependencies> <dependency> <groupId>group-id</groupId> <artifactId>artifact-id</artifactId> <version>latest</version> </dependency> </dependencies> </property> </properties> </configuration> </plugin> </plugins> </build>
затем, в порядке чтобы обновить зависимость, вы должны выполнить цели:
mvn versions:update-properties validate
если есть версия новее 1.1.1, он скажет вам:
[INFO] Updated ${myname.version} from 1.1.1 to 1.3.2
мое решение в maven 3.5.4, используйте nexus, в eclipse:
<dependency> <groupId>yilin.sheng</groupId> <artifactId>webspherecore</artifactId> <version>LATEST</version> </dependency>
затем в eclipse:
atl + F5
и выберитеforce update of snapshots/release
это работает для меня.
Если вы хотите Maven должен использовать последнюю версию зависимости, то вы можете использовать Версии Maven Plugin и как использовать этот плагин, Тим уже дал хороший ответ, следовать его ответ.
но как разработчик, я не буду рекомендовать этот тип практики. Зачем?
ответ на вопрос почему уже дан Паскаль Thivent в комментарии к вопросу
Я действительно не рекомендую эту практику (не используя диапазоны версий) для ради построения воспроизводимости. Сборка, которая начинает внезапно сбой по неизвестной причине куда более раздражает, чем обновление вручную номер версии.
Я буду рекомендовать этот тип практики:
<properties> <spring.version>3.1.2.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> </dependencies>
легко поддерживать и легко отлаживать. Вы можете обновить свой POM в кратчайшие сроки.