Если у вас есть проект Maven любого размера, в частности, включающий много модулей или большое количество зависимостей, вы, вероятно, столкнулись с проблемами при обновлении номеров версий. Конечно, плагин Maven Release отлично справляется с обновлением номеров версий в рамках процесса автоматического выпуска, но бывают случаи, когда он не совсем соответствует требованиям, и номера версий не ограничиваются основными версиями проекта.
В версии плагин очень полезный , но не так хорошо известный плагин Maven , который дает вам ряд инструментов в этом направлении. Вы должны проверить веб-сайт для полного списка всего, что может сделать этот плагин, но здесь, я просто хочу охватить несколько основных моментов.
Плагин Versions, как следует из названия, помогает вам управлять версиями в ваших проектах Maven. Разумеется, версии ваших артефактов, а также версии ваших зависимостей и ваших плагинов. Давайте возьмем это для вращения.
Первое, что вы можете сделать, это получить представление о планировке и посмотреть, какие зависимости в вашем проекте нуждаются в обновлении. В больших проектах используемые вами зависимости со временем часто устаревают, поэтому приятно знать, когда появятся новые. Это можно сделать с помощью команды version: display-dependency-updates , в которой будут перечислены зависимости, которые вы используете в данный момент, и какие из них должны быть обновлены:
$ mvn versions:display-dependency-updates
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'versions'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Game of Life business logic module
[INFO] task-segment: [versions:display-dependency-updates]
[INFO] ------------------------------------------------------------------------
[INFO] [versions:display-dependency-updates {execution: default-cli}]
[INFO] The following dependencies in Dependencies are using the newest version:
[INFO] commons-cli:commons-cli .......................................... 1.2
[INFO] org.hamcrest:hamcrest-all ........................................ 1.1
[INFO]
[INFO] The following dependencies in Dependencies have newer versions:
[INFO] junit:junit ............................................... 4.4 -> 4.7
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
Конечно, плагины находятся в той же самой лодке, поэтому вы также можете запускать версии mvn: display-plugin-updates, чтобы проверить, какие плагины имеют более свежие версии. Несмотря на это, он также сообщит вам, если какие-либо плагины не указали свои версии (что, как правило, не очень хорошая идея):
$ mvn versions:display-plugin-updates
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'versions'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Game of Life business logic module
[INFO] task-segment: [versions:display-plugin-updates]
[INFO] ------------------------------------------------------------------------
[INFO] [versions:display-plugin-updates {execution: default-cli}]
[INFO]
[INFO] The following plugin updates are available:
[INFO] maven-checkstyle-plugin .................................. 2.2 -> 2.4
[INFO] maven-clean-plugin ....................................... 2.2 -> 2.4
[INFO] maven-deploy-plugin ...................................... 2.4 -> 2.5
[INFO] maven-surefire-report-plugin ........................... 2.4.3 -> 2.5
[INFO] org.codehaus.mojo:findbugs-maven-plugin ................ 1.2 -> 2.3.1
[INFO]
[WARNING] The following plugins do not have their version specified:
[WARNING] maven-clean-plugin .......................... (from super-pom) 2.4
[WARNING] maven-deploy-plugin ......................... (from super-pom) 2.5
[WARNING] maven-site-plugin ........................... (from super-pom) 2.1
[WARNING] maven-surefire-plugin ....................... (from super-pom) 2.5
Но плагин Versions не просто останавливается на отчете: вы также можете использовать его для фактического обновления номеров версий в ваших файлах pom.xml. Вы делаете это с помощью команды
mvn version: set . Немного похоже на плагин Maven Release, но без церемонии. В следующем листинге мы обновляем нашу версию проекта с 1.0.0-SNAPSHOT до 1.0.2-SNAPSHOT. Это обновит все версии в любых модулях, а также в любых межмодульных зависимостях:
$mvn versions:set -DnewVersion=1.0.2-SNAPSHOT
[INFO] ----------------------------------------------------------------------------------
[INFO] Building tweeter 1.0.0-SNAPSHOT
[INFO] ----------------------------------------------------------------------------------
[INFO]
[INFO] --- versions-maven-plugin:1.2:set (default-cli) @ tweeter ---
[INFO] Searching for local aggregator root...
[INFO] Local aggregation root: /Users/johnsmart/Projects/Training/coding-dojos/wellington-coding-dojo/tweeter
[INFO] Processing co.nz.codingdojo.tweeter:tweeter
[INFO] Updating project co.nz.codingdojo.tweeter:tweeter
[INFO] from version 1.0.0-SNAPSHOT to 1.0.2-SNAPSHOT
[INFO]
[INFO] Processing co.nz.codingdojo.tweeter:tweeter-core
[INFO] Updating parent co.nz.codingdojo.tweeter:tweeter
[INFO] from version 1.0.0-SNAPSHOT to 1.0.2-SNAPSHOT
[INFO]
[INFO] Processing co.nz.codingdojo.tweeter:tweeter-services
[INFO] Updating parent co.nz.codingdojo.tweeter:tweeter
[INFO] from version 1.0.0-SNAPSHOT to 1.0.2-SNAPSHOT
Но вы также можете обновить свои версии зависимостей, пока вы у них. Если вы хотите обновить их все одним махом, вы можете использовать команду mvn version: use-latest-Version , как показано здесь:
$ mvn versions:use-latest-versions
[INFO] ----------------------------------------------------------------------------------
[INFO] Building tweeter 1.0.0-SNAPSHOT
[INFO] ----------------------------------------------------------------------------------
...
[INFO] artifact javax.servlet:jstl: checking for updates from Nexus
[INFO] artifact net.sourceforge.jwebunit:jwebunit-htmlunit-plugin: checking for updates from Nexus
[INFO] Updated net.sourceforge.jwebunit:jwebunit-htmlunit-plugin:jar:null:2.1 to version 2.4
[INFO] artifact javax.servlet:servlet-api: checking for updates from Nexus
[INFO] Updated javax.servlet:servlet-api:jar:null:2.4 to version 2.5
[INFO] artifact org.springframework:spring-mock: checking for updates from Nexus
[INFO] artifact org.springframework:spring-core: checking for updates from Nexus
[INFO] Updated org.springframework:spring-core:jar:null:2.5.6 to version 3.0.3.RELEASE
[INFO] artifact com.google.inject.extensions:guice-servlet: checking for updates from Nexus
[INFO] ------------------------------------------------------------------------------------------------
Другими целями, которые стоит упомянуть, являются версии mvn: use-latest-Releases , который заменяет зависимости SNAPSHOT на последний выпуск, если они более поздние, и версии mvn: use-Releases , которые заменяют любые зависимости SNAPSHOT, выпущенные соответствующим выпуском. версии. Таким образом, если вы запустите mvn версии: use-release , если будет обновлено с версии 1.0.0-SNAPSHOT до версии 1.0.0, если она доступна, тогда как версии mvn: use-latest-Releases повысят ее до 1.0.2 если есть версия 1.0.2. Существуют также версии: use-next-snapshots и версии: use-latest-snapshots , которые делают то же самое для версий SNAPSHOT.
Наконец, когда вы будете довольны новыми версиями, используйте mvn version: commit для внесения ваших изменений. Это удаляет файлы резервных копий, которые плагин Версии держал, на всякий случай. И если вы наконец решите, что все это ужасная ошибка, просто запустите mvn version: revert , и вы вернетесь в состояние, с которого начали. Легко как!
Если вы хотите узнать больше о тонкостях автоматизации сборки с Maven и кучу других интересных вещей, обязательно ознакомьтесь с буткемпами Java Power Tools , которые скоро появятся в Лондоне и Канберре. Проверьте это!