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

голоса
644

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

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

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

Задан 27/08/2008 в 17:17
источник пользователем
На других языках...                            


12 ответов

голоса
633

ЗАМЕТКА:

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


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

Когда вы зависите от плагина или зависимости, вы можете использовать значение версии Последнего или RELEASE. Последняя относится к последней выпущенной или снимка версии конкретного артефакта, наиболее недавно развернутого артефакта в определенном хранилище. РЕЛИЗ относится к последней версии без снимка в хранилище. В общем, это не лучшая практика для разработки программного обеспечения, которое зависит от неспецифических версии артефакта. При разработке программного обеспечения, вы можете использовать RELEASE или ПОСЛЕДНИЕ как удобство, так что вам не надо обновлять номера версий, когда новый релиз библиотеки третьей стороной отпущена. Когда вы отпустите программное обеспечение, вы всегда должны убедиться, что ваш проект зависит от конкретной версии, чтобы снизить вероятность вашей сборки или вашего проекта, затронутым выпуск программного обеспечения не под вашим контролем.

Смотрите раздел POM Синтаксис книги Maven для более подробной информации. Или увидеть этот документ на Dependency версии Ranges , где:

  • Квадратная скобка ( [& ]) означает «закрытая» (включительно).
  • Скобка ( (& )) означает "открыть" (эксклюзив).

Вот пример, иллюстрирующий различные варианты. В репозитории 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>

Объявляет версию в качестве разделительного (рассосется 1.1.1) (удалены из Maven 3.x):

<version>RELEASE</version>

Обратите внимание , что по умолчанию ваши собственные развертывания будет обновлять «последнюю» запись в метаданных Maven, но обновить запись «Выброс», вам необходимо активировать «отпускания-профиль» из супер POM Maven . Вы можете сделать это либо с «-Prelease профилем» или «-DperformRelease = истина»


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

Следовательно , как правило , хорошая идея , чтобы определить точные версии в более ранних версиях. Как ответ Тима указывает, Maven-версии-плагин представляет собой удобный инструмент для обновления версий зависимости, в частности версий: потребительной последние-версии и версии: потребительная последние-релизы цели.

Ответил 23/07/2009 в 15:58
источник пользователем

голоса
307

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

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

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

Также предоставляются следующие другие цели:

  • версии: дисплей-зависимости обновление сканирует зависимости проекта , и создают отчет о тех зависимости , которые имеют более новые версии.
  • версии: дисплей-плагин-обновления сканирует подключаемые модули проекта , и создает отчет этих плагинов , которые имеют более новые версии.
  • версии: обновление родителем обновления родительского раздела проекта , так что он ссылается на новейшую доступную версию. Например, если вы используете корпоративный корень POM, эта цель может быть полезно , если вам нужно , чтобы убедиться , что вы используете последнюю версию корпоративной корневой POM.
  • версии: обновление-ребенок-модули обновляют родительский раздел дочерних модулей проекта , поэтому версия совпадает с версией текущего проекта. Например, если у вас есть агрегатор POM , который также является родитель для проектов, агрегированных и дети и родители версии рассинхронизации, это харизма может помочь исправить версии дочерних модулей. (Обратите внимание , вам могут понадобиться для вызова Maven с опцией -N для запуска этой цели , если ваш проект разбит настолько плохо , что он не может строить из версии неправильного матча).
  • версии: замок-снимка ищет П для всех версий -snapshot и заменяют их с текущей версией временной метки этого -snapshot, например -20090327.172306-4
  • версии: разблокировка моментальных снимки поиски П для всех временных меток заперты версий моментальных снимков и заменяют их -snapshot.
  • Варианты: Разрешение-диапазоны находят зависимости , используя диапазоны версий и решают используется диапазон для конкретной версии.
  • версии: использование-релизы поиск П для всех версий -snapshot , которые были выпущены и заменяют их с соответствующей версией.
  • версии: потребительные следующие-релизы поиск П для всех версий , не SNAPSHOT , которые были более новым релизом и заменяют их следующую версию.
  • версии: использование-Следующая версия ищет П для всех версий , которые были более новой версией и заменяют их в следующую версии.
  • версии: совершать удаляет файлы pom.xml.versionsBackup. Формы одну половины встроенной «SCM бедняка».
  • версии: Переворот восстанавливает pom.xml файлы из файлов pom.xml.versionsBackup. Формы одну половины встроенной «SCM бедняка».

Просто думал, что я бы включить его для любой будущей ссылки.

Ответил 23/07/2009 в 17:03
источник пользователем

голоса
162

Пожалуйста , обратите внимание на этой странице (раздел «Зависимость от версии Ranges»). То , что вы можете захотеть сделать что - то вроде

<version>[1.2.3,)</version>

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

Ответил 27/08/2008 в 17:56
источник пользователем

голоса
72

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

Что я могу сделать, это сделать Hudson / Jenkins сделать следующее для каждой сборки:

mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage="update versions" -DperformRelease=true

То есть я использую версию плагина и ВСМ плагин для обновления зависимостей, а затем проверить его в системе управления версиями. Да пусть мой 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 плагин глючит и вообще по своей сути недостатки.

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

На самом деле вам нужен отдельный инструмент с Maven для настройки версии (так что вы не зависите от файла п для корректной работы). Я написал такой инструмент в непритязательной языке, Bash. Сценарий будет обновлять версии как версия плагина и проверить П обратно в системе управления версиями. Он также работает как 100x быстрее, чем МВН версии плагина. К сожалению, это не написано в порядке, для общего пользования, но если люди заинтересованы, я мог бы сделать это так, и поместить его в сущности или GitHub.

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

  1. У нас есть 20 или около того проектов в своих собственных хранилищах со своими собственными Дженкинс рабочих мест
  2. Когда мы выпускаем плагин релиз Maven используется. Рабочий процесс, который рассматривается в документации плагина. Релиз плагин Maven рода сосет (и я добр), но она работает. Однажды мы планируем заменить этот метод с чем-то более оптимальным.
  3. Когда один из проектов, освобождаются Дженкинс затем запускает специальное задание, мы будем называть обновления всех версий работой (как Дженкинс знает его выпуск является сложным способом отчасти потому, что плагин Maven Дженкинс релиза довольно паршиво, а).
  4. Обновление всех версий работа знает обо всех 20 проектов. Это на самом деле агрегатор POM быть конкретным со всеми проектами в разделе модулей в порядке зависимости. Дженкинс работает наш магический заводной / Баш Foo, который будет тянуть все проекты обновления версии до последнего, а затем в Poms приезда (опять же сделано в порядке зависимости на основе раздела модулей).
  5. Для каждого проекта, если П изменился (из-за изменения версии в некоторой зависимости) проверяются в а затем мы сразу свистеть Дженкинс запустить соответствующую работу для этого проекта (это, чтобы сохранить порядок зависимостей сборки иначе вы на милости планировщика SCM Poll).

На данный момент я нахожусь на мнении, что это хорошая вещь, чтобы иметь Релизы и AUto версию отдельный инструмента из вашей общей сборки в любом случае.

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

На самом деле мы добавим пользовательские XML атрибутов через пространство имен, чтобы помочь подсказке Баша / заводная скрипты (например, не обновлять эту версию).

Ответил 09/01/2012 в 22:21
источник пользователем

голоса
26

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

Зависимости 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>

Ответил 22/07/2015 в 16:21
источник пользователем

голоса
14

Вы, возможно, в зависимости от версии развития, которые, очевидно, многое изменить в процессе разработки?

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

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

Ответил 27/08/2008 в 17:30
источник пользователем

голоса
6

Кто никогда не используют Последние, пожалуйста, убедитесь, что у вас есть -U в противном случае последний снимок не будет извлечен.

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories
Ответил 03/08/2015 в 08:38
источник пользователем

голоса
5

К тому времени этот вопрос был поставлен там были какие - то перегибы с диапазонами версии в мавена, но они были решены в новых версиях Maven. Эта статья отражает очень хорошо , как версия диапазоны работы и лучшие практики , чтобы лучше понять , как Maven понимает версии: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855

Ответил 03/04/2015 в 16:00
источник пользователем

голоса
3

Правда даже в 3.x он все еще работает, удивительно проекты строят и развертывают. Но последнее / RELEASE ключевого слово вызывает проблемы в М2Э и затмить повсюду, проецирует зависит от зависимости, развернутой через ПОСЛЕДНИЙ / RELEASE не признают версию.

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

Таким образом , можно сделать вывод, использовать версии-Maven-плагин , если вы можете.

Ответил 26/06/2015 в 15:53
источник пользователем

голоса
2

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

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

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

и добавьте версии-Maven-плагин к файлу п:

<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
Ответил 08/05/2017 в 15:59
источник пользователем

голоса
1

МОЕ решение в мавена 3.5.4, используйте нексус, в затмении:

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

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

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

Ответил 07/10/2018 в 03:52
источник пользователем

голоса
0

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

Но, как разработчик, я не буду рекомендовать этот тип практики. ЗАЧЕМ?

Ответ, почему уже дано Pascal 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 в кратчайшие сроки.

Ответил 18/04/2018 в 09:10
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more