Увеличивайте стоимость недвижимости с Maven после каждой сборки
Это сценарий build.xml
в не maven проекте на Netbeans каждый раз, когда я "Build", он увеличивается на 1.
<target name="-pre-compile" description="Sets the buildversion for the current build">
<propertyfile file="${src.dir}\recursos\language.properties">
<entry key="application.buildnumber" value="1" type="int" operation="+"/>
<entry key="application.builddate" value="now" type="date"/>
</propertyfile>
</target>
Это ресурсный файл, который я использую, и я хочу, чтобы Maven тоже написал его:
application.title=Software title...
#build version control
application.buildnumber=334
application.builddate=2016/09/07 15\:16
application.version=1
application.icon=/icons/icon.png
Я уже читал о mojohaus, но, кажется, не подходит то, что мне нужно.
Я знаю, что мне нужно добавить плагин с некоторыми тегами "Выполнения / цели", но я не знаю, как сказать Maven, чтобы увеличить значение этого свойства на 1.
1 ответ
Вот как я успешно это реализовал:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<phase>initialize</phase>
<id>read-props</id>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>src/main/resources/build.properties</file>
</files>
</configuration>
</execution>
<execution>
<phase>generate-resources</phase>
<id>write-props</id>
<goals>
<goal>write-project-properties</goal>
</goals>
<configuration>
<outputFile>src/main/resources/build.properties</outputFile>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<id>add-dynamic-properties</id>
<phase>initialize</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
project.properties.buildnumber = (project.properties.buildnumber.toInteger() + 1).toString();
</source>
</configuration>
</execution>
</executions>
</plugin>
<!-- debug print out, to be removed afterwards -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<echo message="${buildnumber}" />
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Что мы на самом деле делаем:
- Мы используем
properties-maven-plugin
читать файл (через егоread-projet-properties
цель) из файла,src/main/resources/build.properties
вinitialize
фаза, следовательно, действительно рано в цикле сборки по умолчанию - Теперь
buildnumber
свойство было извлечено из файла и части нашей сборки. На этом же этапе мы используемgmave-plugin
увеличить его значение с помощью небольшого скрипта. - Затем во время
generate-resources
фаза (в качестве примера) мы пишем новое значениеbuildnumber
(переопределить) в тот же файл, для следующей будущей итерации. Этот шаг является основополагающим, так как нам нужно где-то хранить состояние, и оно должно находиться под контролем версий, то есть частью проекта.src/main/resources
это, вероятно, не лучший выбор, поскольку он будет упакован вместе с приложением (вы всегда можете пропустить его), поэтому вы можете сохранить его в каком-то другом файле (но все же он должен быть частью версионного проекта). - Then, as a debug/proof, the
antrun
will print the currentbuildnumber
значение.
To make it work, the initial value of the buildnumber
недвижимость в build.properties
file should be set a 0 (the property must exist upfront). However this file would also risk to be continuously in conflict being under version control, that's why the whole behaviour should be wrapped into a maven profile and used only in certain cases (eg the team leader during a release). This constraint would actually lead to a more standard approach: let a CI server handle the whole mechanism, not maven.
Side note: unfortunately, the properties-maven-plugin
doesn't provide much configuration, it will always read and write all the build properties, which is harmless in most of the case although not optimal. Better would be to have an include/exclude mechanism to filter and only read/write the buildnumber
имущество.