Как заставить Maven автоматически использовать последнюю версию зависимости?
Правильный способ использования последней версии зависимости в Maven
Вы задали отличный вопрос, который волнует многих разработчиков. Давайте разберём все варианты по порядку.
Вариант 1: Использование LATEST и RELEASE (НЕ РЕКОМЕНДУЕТСЯ)
Технически вы можете написать:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>LATEST</version>
</dependency>
Однако это плохая практика по нескольким причинам:
- Maven 3 полностью удалил поддержку LATEST и RELEASE для прямых зависимостей (работает только в Maven 2)
- Сборка становится непредсказуемой — сегодня проект собирается, завтра — нет
- Новая версия может содержать критические изменения API
- Нарушается принцип воспроизводимости сборок (reproducible builds)
Вариант 2: Использование диапазонов версий (Рекомендуемый способ)
Maven поддерживает указание диапазонов версий. Вот как это работает:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>[3.12.0,3.14.0)</version>
</dependency>
Синтаксис диапазонов:
[1.0,2.0)— от 1.0 включительно до 2.0 исключительно(1.0,2.0]— от 1.0 исключительно до 2.0 включительно[1.0,)— от 1.0 и выше (будьте осторожны!)(,2.0]— до 2.0 включительно
Вариант 3: Использование properties для централизованного управления
Лучший подход — вынести версии в properties:
<properties>
<commons-lang3.version>3.12.0</commons-lang3.version>
</properties>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
Тогда для обновления достаточно изменить одну строку в properties.
Вариант 4: Автоматическое обновление через Maven плагины
Используйте Maven Versions Plugin для проверки и обновления зависимостей:
# Проверить доступные обновления
mvn versions:display-dependency-updates
# Обновить версии в pom.xml
mvn versions:use-latest-releases
Рекомендации для production-проектов
- Никогда не используйте LATEST/RELEASE в production
- Фиксируйте версии явно — это гарантирует воспроизводимость сборок
- Используйте Dependabot или Renovate для автоматического создания PR с обновлениями
- Тестируйте обновления в отдельной ветке перед merge в main
- Для библиотек используйте семантическое версионирование (semver) — мажорные версии могут менять API
Пример правильного подхода для вашего случая:
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<commons-lang3.version>3.13.0</commons-lang3.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
</dependencies>
Используйте mvn versions:display-dependency-updates раз в месяц, чтобы проверять, не вышли ли новые версии, и обновляйте осознанно.
Альтернативный подход: Использование Maven Enforcer Plugin
Если вы хотите автоматически получать последнюю минорную или патч-версию, но при этом контролировать мажорную версию, используйте комбинацию диапазонов и enforcer-плагина.
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>[3.12,3.13]</version>
</dependency>
Этот диапазон разрешает версии от 3.12.0 до 3.13.x включительно. Maven выберет самую новую из доступных в этом диапазоне.
Чтобы гарантировать, что не будет использована версия 4.0.0 (с потенциальными breaking changes), добавьте enforcer-правило:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<id>enforce-versions</id>
<goals><goal>enforce</goal></goals>
<configuration>
<rules>
<requireUpperBoundDeps/>
<bannedDependencies>
<excludes>
<exclude>org.apache.commons:commons-lang3:[4.0,)</exclude>
</excludes>
</bannedDependencies>
</rules>
</configuration>
</execution>
</executions>
</plugin>
Такой подход даёт гибкость (автоматические патч-обновления) и безопасность (защита от мажорных версий). Подходит для библиотек, которые строго следуют семантическому версионированию.