Есть ли способ настроить версию Maven POM из командной строки?
есть ли способ изменить номер версии без редактирования POM?
<groupId>org.example</groupId>
<artifactId>example</artifactId>
<version>1.0.0</version>
у нас есть система CI, где мы хотим выпустить ночные сборки, но без использования -SNAPSHOT
решение Maven, так что если 1.0.0
является текущей версией, мы просто хотим иметь CI-NIGHTLY-BIULD-20120426
.
я предположил, что это возможно с чем-то вроде mvn deploy -Dversion=CI-NIGHTLY-BIULD-20120426
, но не очевидно. Плохим решением было бы позволить серверу CI редактировать pom.xml
каждый раз, но я думаю, что это очень неудобный.
спасибо!
4 ответов
Я предлагаю использовать классификатор.
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<version>1.0</version>
<properties>
<!-- default classifier is empty -->
<my.project.classifier></my.project.classifier>
</properties>
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<classifier>${my.project.classifier}</classifier>
</configuration>
<executions>...</executions>
</plugin>
</plugins>
</build>
и
mvn package -Dmy.project.classifier=NIGHTLY-2012-04-26_02-30
Maven документация говорит о классификатор:
классификатор: иногда вы можете найти Пятый элемент координата, и это классификатор. Мы посетим классификатор позже, но пока достаточно знать, что такие проекты отображаются как groupId: artifactId: упаковка: классификатор: версия.
и
классификатор позволяет различать артефакты, которые были построены из те же пом, но отличаются по содержанию. Это некоторые необязательные и произвольная строка, которая - если присутствует - добавляется к имени артефакта сразу после номера версии. Как мотивация для этого элемента, рассмотрим, например, проект, который предлагает артефакт, нацеленный на JRE 1.5 но в то же время и артефакт, который до сих пор поддерживает JRE 1.4. Первый артефакт может быть оснащен классификатор jdk15 и второй с jdk14 такой, что клиенты могут выбрать, какой из них использовать.
другой общий случай использования для классификаторов-необходимость прикрепления вторичные артефакты к основному артефакту проекта. Если вы просматриваете Центральный репозиторий Maven, вы заметите, что источники классификаторов и javadoc используются для развертывания исходного кода проекта и документов API вместе с упакованными файлами классов.
Я думаю, вы также можете использовать версии плагин maven. Я нахожу его весьма полезным для подобных вещей.
вы можете сделать это в 2 шага:
- установить необходимую версию:
mvn versions:set -DnewVersion=CI-NIGHTLY-BIULD-20120426
- развернуть:
mvn deploy
- если вам нужно вернуть изменения, используйте
mvn versions:revert
(как указывают)
я настоятельно рекомендую прочитать Maven выпускает стероиды (часть 2, часть 3) Акселя Фонтейна. Это здорово, и я вполне счастлив, используя его.
Это не только детали, как вы con сделать то, что вы просите, но и содержит хороший совет, как вы можете связать свои версии сборки с сервером CI.
в двух словах, то вот основные моменты:
- выпуск Maven медленный, его нужно сделать быстрее!--19-->
-
вы parametarize вашего проекта вариант, как
<version>${VERSION_NUMBER}</version> ... <properties> ... <VERSION_NUMBER>1.0-SNAPSHOT</VERSION_NUMBER> ... </properties>
- локальные сборки получают эту версию:
1.0-SNAPSHOT
- версия сборки только С вашего сервера CI
-
в конфигурации проекта Jenkins / Hudson вы используете
clean deploy scm:tag -DVERSION_NUMBER=${BUILD_NUMBER}
таким образом, вы получаете новый релиз с каждой сборкой Дженкинса, а не только каждую ночь.
Вы можете изменить конфигурация для использования
clean deploy scm:tag -DVERSION_NUMBER=1.0.0-CI-NIGHTLY-BIULD-${BUILD_ID}
и вы получите варианты, как 1.0.0-CI-NIGHTLY-BIULD-2012-04-26_12-20-24
вы можете параметризовать номер версии как
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<version>${my.project.version}</version>
<properties>
<my.project.version>1.0</my.project.version>
</properties>
и диск номер версии из командной строки с помощью
mvn package -Dmy.project.version=NIGHTLY
хотя это возможно, Maven 3 препятствует этому.