В Maven зависимости обычно устанавливаются так:
<dependency>
<groupId>wonderful-inc</groupId>
<artifactId>dream-library</artifactId>
<version>1.2.3</version>
</dependency>
Теперь, если вы работаете с библиотеками, которые имеют частые выпуски, постоянное обновление тега <version> может несколько раздражать. Есть ли способ сказать Maven, чтобы всегда использовать последнюю доступную версию (из хранилища)?
java
maven
dependencies
maven-2
maven-metadata
Андерс Сандвиг
источник
источник
Ответы:
НОТА:
Этот ответ относится только к Maven 2! Упомянутые
LATEST
иRELEASE
metaversions было снято в Maven 3 «ради воспроизводимого строит» , более 6 лет назад. Пожалуйста, обратитесь к этому Maven 3-совместимому решению .Если вы всегда хотите использовать новейшую версию, у Maven есть два ключевых слова, которые вы можете использовать в качестве альтернативы диапазонам версий. Вы должны использовать эти параметры с осторожностью, так как вы больше не контролируете используемые плагины / зависимости.
См. Раздел « Синтаксис POM» книги Maven для более подробной информации. Или посмотрите этот документ в зависимости от версии , где:
[
&]
) означает «закрыто» (включительно).(
&)
) означает «открытый» (исключающий).Вот пример, иллюстрирующий различные варианты. В репозитории Maven com.foo:my-foo имеет следующие метаданные:
Если требуется зависимость от этого артефакта, у вас есть следующие параметры ( конечно, можно указать другие диапазоны версий , просто показывая соответствующие):
Объявите точную версию (всегда разрешите до 1.0.1):
Объявите явную версию (всегда разрешается до 1.0.1, если не происходит коллизия, когда Maven выберет подходящую версию):
Объявите диапазон версий для всех 1.x (в настоящее время разрешается до 1.1.1):
Объявите диапазон открытых версий (разрешится до 2.0.0):
Объявите версию как ПОСЛЕДНЮЮ (разрешается до 2.0.0) (удалено из maven 3.x)
Объявите версию как RELEASE (преобразуется в 1.1.1) (удалена из maven 3.x):
Обратите внимание, что по умолчанию ваши собственные развертывания будут обновлять «последнюю» запись в метаданных Maven, но для обновления записи «release» необходимо активировать «release-profile» из Maven super POM . Вы можете сделать это с помощью -Prelease-profile или -DperformRelease = true.
Стоит подчеркнуть, что любой подход, который позволяет Maven выбирать версии зависимостей (LATEST, RELEASE и диапазоны версий), может оставить вас открытыми для решения проблем со временем, поскольку более поздние версии могут вести себя по-разному (например, плагин для зависимостей ранее переключал значение по умолчанию). значение от истинного до ложного, с ошибочными результатами).
Поэтому, как правило, рекомендуется определять точные версии в выпусках. Как указывает ответ Тима, плагин maven-version-plugin - это удобный инструмент для обновления версий зависимостей, в частности версий: use-latest-version и version: use-latest-Releases .
источник
[1.1,2.0)
Теперь я знаю, что эта тема старая, но, читая вопрос и предоставленный ОП ответ, кажется, что плагин Maven Versions мог бы быть лучшим ответом на его вопрос:
В частности, могут быть полезны следующие цели:
Следующие другие цели также предусмотрены:
Просто подумал, что включу это для любой будущей ссылки.
источник
Пожалуйста, взгляните на эту страницу (раздел «Диапазоны версий зависимостей»). То, что вы можете сделать, это что-то вроде
Эти диапазоны версий реализованы в Maven2.
источник
mvn dependency:tree -Dverbose
понять это. Это может объяснить неожиданную версию.В отличие от других, я думаю, что есть много причин, почему вы всегда можете хотеть последнюю версию. Особенно, если вы делаете непрерывное развертывание (у нас иногда бывает около 5 выпусков в день) и вы не хотите делать многомодульный проект.
Что я делаю, так это заставляю Хадсона / Дженкинса делать следующее для каждой сборки:
То есть я использую плагин версий и плагин scm для обновления зависимостей, а затем возвращаю его в систему контроля версий. Да, я позволил моему CI выполнять проверки SCM (что вы должны сделать в любом случае для плагина релиза maven).
Вы захотите настроить плагин версий для обновления только того, что вы хотите:
Я использую плагин релиза, чтобы сделать релиз, который заботится о -SNAPSHOT и проверяет, существует ли релизная версия -SNAPSHOT (что важно).
Если вы сделаете то, что я делаю, вы получите самую последнюю версию для всех сборок снимков и последнюю версию выпуска для сборок выпуска. Ваши сборки также будут воспроизводимы.
Обновить
Я заметил некоторые комментарии, спрашивающие некоторые особенности этого рабочего процесса. Я скажу, что мы больше не используем этот метод, и основная причина, по которой плагин maven version является глючной и вообще имеет недостатки.
Он имеет недостатки, потому что для запуска плагина версий для настройки версий все существующие версии должны существовать для правильной работы pom. То есть плагин версий не может обновиться до последней версии чего-либо, если он не может найти версию, на которую ссылается pom. Это на самом деле довольно раздражает, так как мы часто очищаем старые версии по соображениям дискового пространства.
На самом деле вам нужен отдельный инструмент от maven для настройки версий (чтобы вы не зависели от правильности работы pom-файла). Я написал такой инструмент на простом языке Bash. Сценарий обновит версии, такие как плагин версии, и вернет pom обратно в систему контроля версий. Он также работает примерно в 100 раз быстрее, чем плагин версий mvn. К сожалению, это не написано для публичного использования, но если бы люди заинтересовались, я мог бы сделать это и поместить его в gist или github.
Возвращаясь к рабочему процессу, когда некоторые комментарии спрашивали о том, что мы делаем:
На данный момент я считаю, что было бы хорошо, если бы релиз и автоматическая версия были отдельным инструментом от вашей общей сборки.
Теперь вы можете подумать, что maven вроде отстой из-за проблем, перечисленных выше, но на самом деле это было бы довольно сложно с инструментом сборки, который не имеет декларативного легко разбираемого расширяемого синтаксиса (иначе XML).
Фактически мы добавляем пользовательские атрибуты XML через пространства имен, чтобы помочь подсказкам сценариев bash / groovy (например, не обновлять эту версию).
источник
Синтаксис зависимостей находится в документации спецификации требований к версии зависимостей . Вот для полноты картины:
В вашем случае вы могли бы сделать что-то вроде
<version>[1.2.3,)</version>
источник
Возможно, вы зависите от версий для разработки, которые сильно меняются в процессе разработки?
Вместо того, чтобы увеличивать версию разрабатываемых выпусков, вы можете просто использовать версию моментального снимка, которую вы перезаписываете при необходимости, что означает, что вам не придется менять тег версии при каждом незначительном изменении. Что-то вроде 1.0-SNAPSHOT ...
Но, может быть, вы пытаетесь достичь чего-то другого;)
источник
Кто когда-либо использовал ПОСЛЕДНЮЮ, пожалуйста, убедитесь, что у вас есть -U, иначе последний снимок не будет получен.
источник
Couldn't download artifact: Failed to resolve version for com.app:common:jar:LATEST
К тому времени, когда этот вопрос был задан, в maven было несколько изломов с диапазонами версий, но они были решены в более новых версиях maven. В этой статье очень хорошо показано, как работают диапазоны версий и передовые практики, чтобы лучше понять, как maven понимает версии: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855
источник
Правда даже в 3.х он все еще работает, на удивление проекты строятся и разворачиваются. Но ключевое слово LATEST / RELEASE, вызывающее проблемы в m2e и затмение повсеместно, ALSO проектов зависит от зависимости, которая развернута через LATEST / RELEASE, не может распознать версию.
Это также вызовет проблему, если вы попытаетесь определить версию как свойство и ссылаться на нее где-либо еще.
Таким образом, вывод заключается в том, что вы можете использовать version-maven-plugin .
источник
Иногда вы не хотите использовать диапазоны версий, потому что кажется, что они "медленные" для разрешения ваших зависимостей, особенно когда есть постоянная доставка на месте и есть тонны версий - в основном во время интенсивной разработки.
Одним из способов решения этой проблемы было бы использование version-maven-plugin . Например, вы можете объявить свойство:
и добавьте version-maven-plugin в ваш файл pom:
Затем, чтобы обновить зависимость, вы должны выполнить цели:
Если есть версия новее, чем 1.1.1, она скажет вам:
источник
Если вы хотите, чтобы Maven использовал последнюю версию зависимости, то вы можете использовать плагин Versions Maven, и как использовать этот плагин, Тим уже дал хороший ответ, следуйте его ответу .
Но, как разработчик, я не буду рекомендовать этот тип практики. ПОЧЕМУ?
Ответ на вопрос, который уже дан Паскалем Тивентом в комментарии к вопросу
Я буду рекомендовать этот тип практики:
это легко поддерживать и легко отлаживать. Вы можете обновить свой POM в кратчайшие сроки.
источник
МОЕ решение в maven 3.5.4, используйте nexus, в затмении:
затем в затмении:
atl + F5
и выберитеforce update of snapshots/release
меня устраивает.
источник