В Maven зависимости обычно настраиваются следующим образом:
<dependency>
<groupId>wonderful-inc</groupId>
<artifactId>dream-library</artifactId>
<version>1.2.3</version>
</dependency>
Теперь, если вы работаете с библиотеками, у которых есть частые выпуски, постоянно обновляйте
@Martin Мне известно о соглашении xyz-SNAPSHOT, но я думал о библиотеках, которые выпускаются в окончательных версиях в репозиторий (т.е. переход от dream-library-1.2.3.jar к dream-library-1.2.4.jar , и так далее).
@PascalThivent Ручное обновление номера выпуска в pom - это боль, если вы делаете непрерывные выпуски. Я использую плагин версий в сочетании с плагином scm, чтобы обойти это (см. Мой ответ).
@PascalThivent Оба раздражают, но по-другому. Я хотел бы выбирать между обоими в зависимости от моей ситуации и не быть вынужденным использовать один, потому что кто-то другой решил, что это будет лучше.
Библиотека guava - хороший пример последней версии, в которой классы удалены из более ранних версий, что затем нарушает сборку. Мышление Maven состоит в том, что любая более новая версия может заменить любую более раннюю, что на практике не выполняется.




Возможно, вы зависите от разрабатываемых версий, которые, очевидно, сильно меняются в процессе разработки?
Вместо увеличения версии разрабатываемых выпусков вы можете просто использовать версию моментального снимка, которую вы перезаписываете при необходимости, что означает, что вам не придется менять тег версии при каждом незначительном изменении. Что-то вроде 1.0-SNAPSHOT ...
Но, возможно, вы пытаетесь добиться чего-то другого;)
Взгляните на эта страница (раздел «Диапазоны версий зависимостей»). Возможно, вы захотите сделать что-то вроде
<version>[1.2.3,)</version>
Эти диапазоны версий реализованы в Maven2.
Возможно, вы захотите поближе взглянуть на то, как Maven сравнивает номера версий - если вы не соответствуете строгому шаблону, Maven сравнивает как строки, а не числа.
Эта страница находится на Codehaus и описывает себя как вещи, «которые еще не реализованы для Maven 2.0» ... Сама документация Maven ничего не говорит о диапазонах версий. Я что-то пропустил? Когда были представлены диапазоны версий? Где они описаны в официальной документации?
Вы ошибаетесь, диапазон версий означает, что все версии ОК от 1.2.3 и выше. Это совсем не последняя версия.
ПРИМЕЧАНИЕ:
Упомянутые метаверсии LATEST и RELEASEбыли удалены для зависимостей плагинов в Maven 3 "ради воспроизводимых сборок", более 6 лет назад.
(Они по-прежнему отлично работают с обычными зависимостями.)
Информацию о зависимостях плагинов см. В этом Решение, совместимое с Maven 3.
Если вы всегда хотите использовать самую новую версию, у Maven есть два ключевых слова, которые вы можете использовать в качестве альтернативы диапазонам версий. Вам следует использовать эти параметры с осторожностью, поскольку вы больше не контролируете плагины / зависимости, которые используете.
When you depend on a plugin or a dependency, you can use the a version value of LATEST or RELEASE. LATEST refers to the latest released or snapshot version of a particular artifact, the most recently deployed artifact in a particular repository. RELEASE refers to the last non-snapshot release in the repository. In general, it is not a best practice to design software which depends on a non-specific version of an artifact. If you are developing software, you might want to use RELEASE or LATEST as a convenience so that you don't have to update version numbers when a new release of a third-party library is released. When you release software, you should always make sure that your project depends on specific versions to reduce the chances of your build or your project being affected by a software release not under your control. Use LATEST and RELEASE with caution, if at all.
Подробнее см. Раздел синтаксиса 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 выберет подходящую версию):
<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 выбирать версии зависимостей (LATEST, RELEASE и диапазоны версий), может оставить вас открытыми для проблем со временем сборки, так как более поздние версии могут иметь другое поведение (например, плагин зависимостей ранее переключал значение по умолчанию значение от истины до ложи, с запутанными результатами).
Поэтому обычно рекомендуется определять точные версии в выпусках. Как указывает Ответ тима, плагин версий maven - удобный инструмент для обновления версий зависимостей, особенно целей версии: используйте последние версии и версии: использовать-последние-выпуски.
Я думаю, что ПОСЛЕДНИЙ / РЕЛИЗ очень важен для плагинов, которые обеспечивают функциональность развертывания. Например, мы используем плагин, который развертывает новую версию артефактов на наших серверах. Если серверы изменятся, мы выпускаем новую версию плагина, и все проекты, использующие этот плагин, должны быть обновлены вручную, чтобы использовать новую версию плагина развертывания.
@RichSeller Привет, Рич! Я потратил немного времени на это, прежде чем понял, что это больше не доступно в Maven 3.0;) Не могли бы вы отредактировать ответ, чтобы он начинался с обновления, в котором говорится о депреакции Maven 3.0? Огромное спасибо!
Я считаю, что хорошим балансом было бы заблокировать основную версию, но получить последнюю второстепенную (или патч) версию (в зависимости от того, что используется для исправления ошибок, только в artifcat, от которого вы зависите). С текущим синтаксисом это возможно только с диапазоном вроде (примечание: начинается с скобок и заканчивается скобками): [1.1,2.0)
FWIW ... обновлена ссылка на примечания по совместимости Maven3: cwiki.apache.org/confluence/display/MAVEN/…
Стоит отметить, что диапазон [1.0.0, 2.0.0] не включает 1.0-SNAPSHOT, но включает 2.0-SNAPSHOT.
Взгляните на конфигурацию плагина enforcer - maven.apache.org/enforcer/enforcer-rules/…
Теперь я знаю, что эта тема старая, но, читая вопрос и предоставленный OP ответ, кажется, что Плагин Maven Versions мог бы действительно быть лучшим ответом на его вопрос:
В частности, могут быть полезны следующие цели:
Также предусмотрены следующие другие цели:
Просто подумал, что включу его для справок в будущем.
В этом контексте, в чем разница между «выпуском» и «версией».
@BenNoland, я считаю, что разница в этом случае в том, что следующая версия может не быть артефактом выпуска. Например. учитывая артефакт с версией 1.0.0-SNAPSHOT, 1.0.0 и 1.0.1-SNAPSHOT, а также ссылку pom на 1.0.0-SNAPSHOT, версии: next-versions и versions: next-Release будут преобразованы в 1.0.0, в то время как версии: latest-versions и versions: latest-релизы будут соответственно преобразованы в 1.0.1-SNAPSHOT и 1.0.0.
Распечатка всех возможных и не связанных целей бесполезна.
Я ищу то, что будет делать обратное по отношению к версиям: диапазон разрешения. У меня есть pom, который был решен, что я хочу открыть резервную копию до более новых версий (т.е. перейти с
@fmpdmb Как бы вы могли решить, что это должно быть: <version>[1.2,)</version>, <version>[1.2,2.0)</version> или <version>[1.0,2.0)</version>?
@SimonForsberg, может быть, тоже собственность, которую нужно поддерживать?
Можете ли вы попросить плагин версий просматривать зависимости только с определенным groupId, например com.mycompany? Я хочу анализировать только внутренние зависимости для последних версий, так как анализ всего занимает много времени ...
@vikingsteve, если вы используете свойства для внутренних номеров версий, и mvn versions:display-property-updates, он будет работать намного быстрее
Я бы подумал, что версии: use-latest-versions решают большинство проблем OP.
Но ... работает ли он только для определенной зависимости?
В отличие от других, я думаю, что есть много причин, по которым вы можете использовать версию всегда хочу самое последнее. В частности, если вы выполняете непрерывное развертывание (у нас иногда бывает около 5 выпусков в день) и не хотите делать многомодульный проект.
Что я делаю, так это заставляю Хадсона / Дженкинса делать следующее для каждой сборки:
mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage = "update versions" -DperformRelease=true
То есть я использую подключаемые модули версий и scm для обновления зависимостей, а затем проверяю их в системе управления версиями. Да, я позволяю своему CI выполнять проверки SCM (что вы все равно должны делать для плагина выпуска maven).
Вы захотите настроить плагин версий, чтобы обновлять только то, что вы хотите:
<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 глючит и в целом изначально ошибочен.
Это ошибочно, потому что для запуска плагина версий для настройки версий все существующие версии должны существовать для правильной работы pom. То есть плагин версий не может обновить что-либо до последней версии, если он не может найти версию, указанную в файле pom. На самом деле это довольно неприятно, поскольку мы часто очищаем старые версии из-за недостатка места на диске.
На самом деле вам нужен отдельный инструмент от maven для настройки версий (чтобы вы не зависели от правильной работы файла pom). Я написал такой инструмент на простом языке Bash. Скрипт обновит версии, такие как плагин версии, и вернет pom обратно в систему управления версиями. Он также работает в 100 раз быстрее, чем плагин mvn versions. К сожалению, он не написан для публичного использования, но если людям интересно, я могу сделать это и поместить в gist или github.
Возвращаясь к рабочему процессу, поскольку некоторые комментарии спрашивали о том, что мы делаем:
На данный момент я придерживаюсь мнения, что в любом случае хорошо, чтобы выпуск и автоматическая версия были отдельным инструментом от вашей общей сборки.
Теперь вы можете подумать, что maven отстой из-за проблем, перечисленных выше, но на самом деле это было бы довольно сложно с инструментом сборки, который не имеет декларативного синтаксиса, который легко анализировать расширяемый (он же XML).
Фактически, мы добавляем настраиваемые атрибуты XML через пространства имен, чтобы помочь нам подсказывать сценарии bash / groovy (например, не обновляйте эту версию).
Спасибо, что включили в свой ответ мотивацию (непрерывное развертывание).
Я думаю, что важным моментом здесь является то, что сборки можно воспроизводить с помощью этого метода, тогда как при использовании диапазонов версий или -LATEST это не так!
Я хотел бы использовать решение с помощью внешнего инструмента, внося изменения в проект pom перед запуском сборки. Мы также используем этот подход, поскольку плагин диапазона версий по своей сути содержит ошибки, например, с учетом дат, а не только версий.
К тому времени, когда этот вопрос был задан, в maven были некоторые проблемы с диапазонами версий, но они были устранены в более новых версиях maven. Эта статья очень хорошо описывает, как работают диапазоны версий, и передовые практики, чтобы лучше понять, как maven понимает версии: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855
Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включает сюда основные части ответа и предоставляет ссылку для справки.
Правда в том, что даже в 3.x он все еще работает, на удивление проекты строятся и разворачиваются. Но ключевое слово LATEST / RELEASE вызывает проблемы в m2e и eclipse повсюду, ТАКЖЕ проекты зависят от зависимости, которая развернута через LATEST / RELEASE, не может распознать версию.
Это также вызовет проблему, если вы попытаетесь определить версию как свойство и ссылаться на нее в другом месте.
Итак, вывод - используйте версии-maven-plugin, если можете.
Синтаксис зависимостей находится в документации Спецификация требований к версии зависимостей. Вот он для полноты:
Dependencies'
versionelement define version requirements, used to compute effective dependency version. Version requirements have the following syntax:
1.0: "Soft" requirement on 1.0 (just a recommendation, if it matches all other ranges for the dependency)[1.0]: "Hard" requirement on 1.0(,1.0]: x <= 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; multiple sets are comma-separated(,1.1),(1.1,): this excludes 1.1 (for example if it is known not to work in combination with this library)
В вашем случае вы могли бы сделать что-то вроде <version>[1.2.3,)</version>
Кто когда-либо использовал ПОСЛЕДНИЕ, убедитесь, что у вас есть -U, иначе последний снимок не будет извлечен.
mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories
Это не извлекает последний снимок из локального репозитория m2
Иногда вы не хотите использовать диапазоны версий, потому что кажется, что они «медленно» разрешают ваши зависимости, особенно когда идет непрерывная доставка и существует множество версий - в основном во время интенсивной разработки.
Один из способов обхода - использовать версии-maven-plugin. Например, вы можете объявить свойство:
<properties>
<myname.version>1.1.1</myname.version>
</properties>
и добавьте плагин versions-maven-plugin в свой файл 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 использовал последнюю версию зависимости, тогда вы можете использовать Плагин Versions Maven, и как использовать этот плагин, Тим уже дал хороший ответ, следуйте его отвечать.
Но как разработчик я не буду рекомендовать такой подход. ПОЧЕМУ?
ответ на почему уже дан Паскаль Тивент в комментарии к вопросу
I really don't recommend this practice (nor using version ranges) for the sake of build reproducibility. A build that starts to suddenly fail for an unknown reason is way more annoying than updating manually a version number.
Я рекомендую такой вид практики:
<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 в кратчайшие сроки.
если вы используете модули-версии-maven-plugin, сборка все еще воспроизводима. Обновление версии maven может быть выполнено в отдельном коммите (как вы можете видеть из моего ответа, вам нужно указать отдельную цель, это просто не происходит волшебным образом в сборке).
Мое решение в 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
меня устраивает.
Не работает в командной строке, хотя по причинам, умело указанным выше в различных сообщениях. Многие из нас должны соответствовать автоматизированным сборкам, поэтому наши POM должны работать при запуске из командной строки, а не только в Eclipse.
Я действительно не рекомендую эту практику (или использование диапазонов версий) ради воспроизводимости сборки. Сборка, которая внезапно начинает давать сбой по неизвестной причине, намного раздражает больше, чем обновление номера версии вручную.