Как мне сообщить Maven, чтобы он использовал последнюю версию зависимости?

StackOverflow https://stackoverflow.com/questions/30571

Вопрос

В Maven зависимости обычно настраиваются следующим образом:

<dependency>
  <groupId>wonderful-inc</groupId>
  <artifactId>dream-library</artifactId>
  <version>1.2.3</version>
</dependency>

Теперь, если вы работаете с библиотеками, которые выпускаются часто, постоянное обновление тега <version> может несколько раздражать.Есть ли способ сказать Maven всегда использовать последнюю доступную версию (из репозитория)?

Это было полезно?

Решение

ПРИМЕЧАНИЕ:

Этот ответ применим только к Maven 2!Упомянутый LATEST и RELEASE метаверсии были исключены из Maven 3 «ради воспроизводимых сборок»., более 6 лет назад.Пожалуйста, обратитесь к этому Решение, совместимое с Maven 3.


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

Если вы зависите от плагина или зависимости, вы можете использовать значение версии LATEST или RELEASE.LATEST относится к последней выпущенной или моментальной версии определенного артефакта, самому последнему развернутому артефакту в определенном репозитории.RELEASE относится к последнему выпуску в репозитории, не являющемуся моментальным снимком.В общем, не рекомендуется разрабатывать программное обеспечение, зависящее от неспецифической версии артефакта.Если вы разрабатываете программное обеспечение, вы можете использовать RELEASE или LATEST для удобства, чтобы вам не приходилось обновлять номера версий при выпуске новой версии сторонней библиотеки.При выпуске программного обеспечения вы всегда должны убедиться, что ваш проект зависит от конкретных версий, чтобы снизить вероятность того, что на вашу сборку или проект повлияет выпуск программного обеспечения, не находящийся под вашим контролем.Используйте LATEST и RELEASE с осторожностью, если вообще используете.

См. Раздел синтаксиса 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 супер ПОМ.Вы можете сделать это с помощью «-Prelease-profile» или «-DperformRelease=true».


Стоит подчеркнуть, что любой подход, который позволяет Maven выбирать версии зависимостей (LATEST, RELEASE и диапазоны версий), может оставить вас открытым для проблем со временем сборки, поскольку более поздние версии могут иметь другое поведение (например, плагин зависимостей ранее переключил версию по умолчанию). значение от true до false, что приводит к запутанным результатам).

Поэтому обычно рекомендуется определять точные версии в выпусках.Как Ответ Тима указывает, что maven-версии-плагин — удобный инструмент для обновления версий зависимостей, особенно версии: использовать последние версии и версии: используйте последние версии цели.

Другие советы

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

В частности, могут быть полезны следующие цели:

  • версии: использовать последние версии Поиск POM для всех версий, которые были более новой версией, и заменяет их последней версией.
  • версии: используйте последние версии Поиск по POM для всех версий без SNAPSHOT, которые были более новым выпуском, и заменяет их на последнюю версию выпуска.
  • версии: обновление-свойства Свойства обновлений, определенные в проекте, так что они соответствуют последней доступной версии конкретных зависимостей.Это может быть полезно, если все набор зависимостей должны быть заблокированы в одной версии.

Также предусмотрены следующие другие цели:

  • версии: display-dependent-updates Сканирует зависимости проекта и дает отчет о тех зависимостях, которые имеют более новые версии.
  • версии: display-plugin-updates Сканирует плагины проекта и дает отчет о тех плагинах, которые имеют более новые версии.
  • версии: обновление-родитель Обновляет родительский раздел проекта, чтобы он ссылался на новейшую доступную версию.Например, если вы используете корпоративный корневой POM, эта цель может быть полезна, если вам нужно убедиться, что вы используете последнюю версию корпоративного корневого POM.
  • версии: update-child-modules Обновляет родительский раздел детских модулей проекта, чтобы версия соответствовала версии текущего проекта.Например, если у вас есть POM агрегатора, который также является родителем для проектов, которые его агрегирует, а дети и родительские версии выходят из синхронизации, этот моджо может помочь исправить версии детских модулей.(Обратите внимание, что вам может потребоваться вызвать Maven опцией -n, чтобы выполнить эту цель, если ваш проект будет сломан настолько сильно, что не может построить из -за неправильной версии).
  • версии: блокировки-снимки Ищет POM для всех версий -SNAPSHOT и заменяет их на текущую версию TimeStam-20090327.172306-4
  • версии: разблокировка-снимки Поиск по POM для всех версий снимков, заблокированных времен, заменяет их на -снапшот.
  • версии: разрешить-диапазоны Находит зависимости, использующие диапазоны версий и разрешают диапазон для конкретной используемой версии.
  • версии:использовать-релизы Ищет POM для всех версий -SNAPSHOT, которые были выпущены, и заменяет их соответствующей версией выпуска.
  • версии: используйте следующие релизы Поиск POM для всех версий без SNAPSHOT, которые были более новым выпуском, и заменяет их на следующую версию релиза.
  • версии: использовать-следующие-версии Ищет POM для всех версий, которые были более новой версией, и заменяет их следующей версией.
  • версии: зафиксировать удаляет файлы pom.xml.versionsBackup.Образует половину встроенного «SCM бедного человека».
  • версии: вернуться Восстанавливает файлы pom.xml из файлов pom.xml.versionsbackup.Образует половину встроенного «SCM бедного человека».

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

Пожалуйста, взгляните на эта страница (раздел «Диапазоны версий зависимостей»).Возможно, вы захотите сделать что-то вроде

<version>[1.2.3,)</version>

Эти диапазоны версий реализованы в Maven2.

В отличие от других, я думаю, что есть много причин, по которым вы могли бы всегда хочу последних новостей версия.Особенно, если вы выполняете непрерывное развертывание (иногда у нас выходит около 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.К сожалению, он написан не для публичного использования, но если людям интересно, я мог бы сделать это и поместить в gist или github.

Возвращаясь к рабочему процессу, поскольку в некоторых комментариях спрашивали, что мы делаем:

  1. У нас есть около 20 проектов в их собственных репозиториях со своими собственными заданиями в Дженкинсе.
  2. Когда мы выпускаем, используется плагин maven Release.Рабочий процесс описан в документации плагина.Плагин выпуска maven отстой (и я добр), но он работает.Когда-нибудь мы планируем заменить этот метод чем-то более оптимальным.
  3. Когда один из проектов будет выпущен, jenkins затем запустит специальное задание, которое мы назовем заданием обновления всех версий (как jenkins узнает, что его выпуск - это сложный способ, отчасти потому, что плагин выпуска maven jenkins тоже довольно дрянной).
  4. Задание обновления всех версий знает обо всех 20 проектах.На самом деле это агрегатор со всеми проектами в разделе модулей в порядке зависимости.Дженкинс запускает наш волшебный groovy/bash foo, который вытянет все проекты, обновит версии до последних, а затем проверит poms (опять же выполняется в порядке зависимости на основе раздела модулей).
  5. Для каждого проекта, если pom изменился (из-за изменения версии в какой-либо зависимости), он проверяется, а затем мы немедленно проверяем jenkins, чтобы запустить соответствующее задание для этого проекта (это необходимо для сохранения порядка зависимостей сборки, в противном случае вы находитесь во власти планировщика опроса SCM).

На данный момент я считаю, что в любом случае полезно иметь версию Release и Auto в качестве отдельного инструмента от вашей общей сборки.

Теперь вы можете подумать, что maven — отстой из-за проблем, перечисленных выше, но на самом деле это было бы довольно сложно с инструментом сборки, который не имеет декларативного кода, который легко анализировать. расширяемый синтаксис (он же XML).

Фактически мы добавляем пользовательские атрибуты XML через пространства имен, чтобы помочь сценариям bash/groovy (например,не обновляйте эту версию).

Синтаксис зависимостей находится по адресу Спецификация требований к версии зависимости документация.Вот для полноты картины:

Зависимости version элемент определяет требования к версии, используемые для вычисления эффективной версии зависимости.Требования к версии имеют следующий синтаксис:

  • 1.0:«Мягкое» требование для версии 1.0 (просто рекомендация, если оно соответствует всем остальным диапазонам зависимости)
  • [1.0]:«Жесткое» требование для версии 1.0
  • (,1.0]:х <= 1,0
  • [1.2,1.3]:1,2 <= х <= 1,3
  • [1.0,2.0):1,0 <= х < 2,0
  • [1.5,):х >= 1,5
  • (,1.0],[1.2,):х <= 1,0 или х >= 1,2;несколько наборов разделяются запятыми
  • (,1.1),(1.1,):Это исключает 1.1 (например, если известно, что не работает в сочетании с этой библиотекой)

В вашем случае вы можете сделать что-то вроде <version>[1.2.3,)</version>

Возможно, вы зависите от разрабатываемых версий, которые, очевидно, сильно меняются во время разработки?

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

Но, возможно, вы пытаетесь достичь чего-то другого;)

Кто когда-либо использовал LATEST, убедитесь, что у вас есть -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 повсюду. Проекты ALSO зависят от зависимости, которая, развернутая с помощью LATEST/RELEASE, не распознает версию.

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

Итак, вывод: используйте версии-maven-плагин если вы можете.

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

Одним из обходных путей было бы использование версии-maven-плагин.Например, вы можете объявить свойство:

<properties>
    <myname.version>1.1.1</myname.version>
</properties>

и добавьте плагинversion-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 использовал последнюю версию зависимости, вы можете использовать Версии Плагин Maven а как использовать этот плагин, Тим уже дал хороший ответ, следите за его отвечать.

Но как разработчик я не буду рекомендовать подобные практики.ПОЧЕМУ?

ответ на вопрос почему уже дан Паскаль Тивент в комментарии к вопросу

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

Я рекомендую такой вид практики:

<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 3.5.4, используйте Nexus, в eclipse:

<dependency>
    <groupId>yilin.sheng</groupId>
    <artifactId>webspherecore</artifactId>
    <version>LATEST</version> 
</dependency>

затем в затмении: atl + F5, и выберите force update of snapshots/release

меня устраивает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top