Захотелось для Maven проекта, размещенного в разных местах и с разными билдами, знать точную версию в виде changeset'a из репозитория Mercurial.
Ниже быстрое, простое (без scm плагина) и не слишком гибкое решение в виде кусков pom.xml.
<build>
...
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.0</version>
<configuration>
<doCheck>true</doCheck>
<doUpdate>false</doUpdate>
<format>At {0,date,dd-MM-yyyy HH:mm:ss} rev {1} was built.</format>
<items>
<item>timestamp</item>
<item>${changeSet}</item>
</items>
</configuration>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>hgchangeset</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
По порядку:
- Подключили плагин
buildnumber-maven-plugin
- Опция
doCheck
нужна для проверки на наличие локальных незафиксированных изменений в проекте. Мы же хотим, чтобы изменение версии было жестко привязано к коммиту. - Как я понял,
doUpdate
нужен для SVN, чтобы при сборке проекта у нас локально были самые свежие изменения (в документации описано плохо). По-моему это вообще имеет смысл только для централизованной VCS, так что отключаем этот пункт. - Поле
format
отвечает за формат переменной${buildNumber}
, в которую и записывается версия. 0-ое поле имеет специальный формат для даты и ему передается специальныйitem
, возвращающий время на момент сборки; вместо 1-го поля подставляется переменная${changeSet}
, которая появляется в результате работы целиhgchangeset
. Такжеhgchangeset
создает переменнуюchangeSetDate
с датой changeset'а.
Теперь в переменной ${buildNumber}
у нас имеется готовая версия, которую нужно куда-нибудь положить для дальнейшего употребления в приложении. Логичным местом для этого является манифест архива. В моем случае это был .war. Соответственно, настройка war-плагина:
<build>
...
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<Implementation-Build>${changeSet} (@${changeSetDate})</Implementation-Build>
</manifestEntries>
</archive>
</configuration>
...
</plugin>
...
</plugins>
...
</build>
С такими настройками в каталоге META-INF
появляется файл MANIFEST.MF
примерно следующего содержания:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: USERNAME
Build-Jdk: 1.7.0_147-icedtea
Implementation-Title: PROJECT_TITLE
Implementation-Version: 1.0
Implementation-Vendor-Id: com.EXAMPLE
Implementation-Build: c6603b09df8b (@"2012-02-07 01:58 +0400")
Комментариев нет :
Отправить комментарий