[Из песочницы] Управление версиями зависимостей в Maven проекте
Одним из преимуществ организации Java проекта с помощью Maven является удобное описание всех библиотек и их версий, которые для него требуются. Далее, по мере развития проекта, нам наверняка захочется иметь возможность обновлять версии этих библиотек. Такой функционал предоставляет расширение Versions Maven.
Управление версиями зависимостей можно разделить на три части:
- версия родительского проекта (если имеется);
- версия зависимостей;
- версия используемых расширений Maven.
Самая простая задача — это обновление версии родительского проекта. Достаточно в корне вашего проекта запустить команду:
mvn versions:update-parent
Для того, чтобы иметь возможность обновлять версии остальных зависимостей, их версии необходимо в явном виде описать как переменные в разделе properties проекта Maven. Зависимости, версии которых описаны без ссылки на переменную, обновить таким образом не получится.
Это же относится и к версиям всех используемых вами расширений. Таким образом, нужно явно прописать в проекте все используемые расширения с вынесением их версий в переменные, после чего их версии тоже начнут обновляться.
В результате, все наши зависимости и расширения будут выглядеть таким образом:
4.2.0.RELEASE
2.6.1
org.springframework
spring-context-support
${spring.version}
org.apache.maven.plugins
maven-clean-plugin
auto-clean
initialize
clean
org.apache.maven.plugins
maven-clean-plugin
${maven-clean.version}
Чтобы разобраться с тем, какие ещё расширения мы не указали явным образом, нам нужно воспользоваться командой:
mvn versions:display-plugin-updates
по результатам работы которой можно узнать, какие ещё расширения не прописаны в вашем проекте и версиями которых вы не управляете. Так же будет указано, какую минимальную версию Maven необходимо указать в вашем проекте для корректной работы всех расширений.
Важно отметить, что зависимости, которые включаются в ваш проект через родительский проект, не будут обновлять версии пока вы их явно не включите в список зависимостей своего проекта, перенеся из родительского. Это может быть полезно, если в своём проекте вы хотите иметь отличный набор версий чем предоставляет готовый родительский проект.
После выполнения всех описанных выше операций мы можем непосредственно обновить все версии описанные нами как переменные, запустив команду:
mvn versions:update-properties
Далее вы можете просмотреть список внесённых расширением правок в Maven проект и принять решение об их целесообразности.
Просматривая список предложенных новых версий, вы очень быстро обнаружите, что там начинаются появляться не финальные версии зависимостей, которые скорее всего вам не нужны. Для описания, какие версии при обновлении вы бы хотели пропускать, служит специальный файл, где можно описать исключения в виде конкретных версий или regex выражений для конкретных зависимостей или их групп.
Создадим файл maven-version-rules.xml в корне проекта с таким содержимым:
.*Alpha.*
.*Beta.*
.*[.]CR.*
И подключим его:
org.codehaus.mojo
versions-maven-plugin
false
file://${project.basedir}/maven-version-rules.xml
В результате, вы можете захотеть создать такой файл update.bat (как вариант, update.sh) для обновления версий в будущем:
call mvn versions:update-parent versions:update-properties
или только:
call mvn versions:update-properties
Нужно отметить, что такие проекты как Spring IO platform и Spring Boot в своих родительских проектах уже предоставляют актуальные и протестированные на совместимость версии очень большого количества библиотек, что позволяет использовать их в своих проектах без указание конкретной версии.
Все исходники доступны на GitHub.