~/home of geeks

Aussagekräftige Buildversionsnummern in Maven

· 250 Wörter · 2 Minute(n) Lesedauer

Maven

In agilen Projekten werden ständig neue Versionen der Software gebaut. Eine aussagekräftige Build-Versionsnummer hilft den Überblick zu behalten.

In agilen Projekten werden pro Commit oder in regelmäßigen Abständen Versionen der Software gebaut und oft auf einem Test- oder Integrationssystem installiert.

Die von Maven verwendete ${project.version} der Form 1.0.0-SNAPSHOT ist für Releasezyklen sehr gut geeignet, aber für Entwicklungs- und Testzyklen, die viel kleiner sind, eher nicht. Denn wenn Entwickler im Verlauf eines Sprints Features fertigstellen, haben alle Builds die Projektversion und sind nicht voneinander zu unterscheiden. Ergänzt man die Versionsinformationen um z. B. einen Zeitstempel, kann besser nachgehalten werden, welche Commits in einer Version enthalten sind.

Hierbei hilft das Maven-Plugin org.codehaus.mojo.buildnumber-maven-plugin.

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <phase>validate</phase>
            <goals>
                <goal>create</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <format>{0,date,yyyy-MM-dd HH:mm:ss}</format>
            <items>
                <item>timestamp</item>
            </items>
    </configuration>
</plugin>

Nun steht unter der Maven-Variable ${buildNumber} ein Zeitstempel zur Verfügung.

Diese lässt sich einfach in einer Propertiesdatei referenzieren: version.properties:

version=${project.version}-${buildNumber}

Die aktuelle Version setzt sich also zusammen aus:

  • ${project.version} -> 1.0.0-SNAPSHOT
  • ${buildNumber} -> yyyy-MM-dd HH:mm:ss

Dabei nicht vergessen, die Variablenersetzung im Buildprozess zu aktivieren:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
            <filtering>true</filtering>
        </testResource>
    </testResources>
    // ...

Die Ausgabe kann dann in einer UI oder in den Logs erfolgen. Wahlweise kann auch im fertigen JAR oder WAR Archiv die Propertiesdatei angeschaut werden, um die Version zu sehen.

@Log4j2
public class Application {
    public static void main(String[] args) {
        String version = ResourceBundle.getBundle("version").getString("version");
        if (StringUtils.isNotBlank(version)) {
            log.info("Version {}.", version);
        } else {
            LOGlog.warn("Keine Versionsinformation verfügbar.");
        }
        ...
    }
}