ℹ Also available as Gradle Plugin
This extension will virtually set project versions, based on current Git branch or Git tag.
ℹ The pom files will not be modified, versions are modified in memory only.
- Get rid of...
- editing
pom.xml - managing version by git and within files
- Git merge conflicts
- editing
create or update ${basedir}/.mvn/extensions.xml file
<extensions xmlns="http://maven.apache.org/EXTENSIONS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd">
<extension>
<groupId>me.qoomon</groupId>
<artifactId>maven-git-versioning-extension</artifactId>
<version>4.10.0</version>
</extension>
</extensions>ℹ Consider CI/CD section when running this extension in a CI/CD environment
You can configure the final version format for specific branches and tags separately.
Create ${basedir}/.mvn/maven-git-versioning-extension.xml.
Example: maven-git-versioning-extension.xml
<gitVersioning>
<branch>
<pattern>master</pattern>
<versionFormat>${version}</versionFormat>
</branch>
<branch>
<pattern><![CDATA[feature/(?<feature>.+)]]></pattern>
<versionFormat>${feature}-SNAPSHOT</versionFormat>
</branch>
<tag>
<pattern><![CDATA[v(?<tagVersion>[0-9].*)]]></pattern>
<versionFormat>${tagVersion}</versionFormat>
</tag>
<commit>
<versionFormat>${commit.short}</versionFormat>
</commit>
</gitVersioning>-
optional
<updatePom>global enable(true)/disable(false) version update in original pom file. -
optional
<preferTags>global enable(true)/disable(false) prefer tag rules over branch rules if both match. -
<branch>specific version format definition.<pattern>An arbitrary regex to match branch names (has to be a full match pattern e.g.feature/.+)<versionFormat>An arbitrary string, see Version Format & Placeholders<property>A property definition to update the value of a property<pattern>An arbitrary regex to match property names<valueFormat>The new value format of the property, see Version Format & Placeholders- optional
<valuePattern>An arbitrary regex to match and use capture group values of property value
- optional
<updatePom>Enable(true) or disable(false) version update in original pom fill (will override global<updatePom>value) - ⚠ considered if...
- HEAD attached to a branch
git checkout <BRANCH> - Or branch name is provided by environment variable or command line parameter
- HEAD attached to a branch
-
<tag>specific version format definition.<pattern>An arbitrary regex to match tag names (has to be a full match pattern e.g.v[0-9].*)<versionFormat>An arbitrary string, see Version Format & Placeholders<property>A property definition to update the value of a property<pattern>An arbitrary regex to match property names<valueFormat>The new value format of the property, see Version Format & Placeholders- optional
<valuePattern>An arbitrary regex to match and use capture group values of property value
- optional
<updatePom>Enable(true) or disable(false) version update in original pom fill (will override global<updatePom>value) - ⚠ considered if...
- HEAD is detached
git checkout <TAG> - Or tag name is provided by environment variable or command line parameter
- HEAD is detached
-
<commit>specific version format definition.<versionFormat>An arbitrary string, see Version Format & Placeholders<property>A property definition to update the value of a property<pattern>An arbitrary regex to match property names<valueFormat>The new value format of the property, see Version Format & Placeholders- optional
<valuePattern>An arbitrary regex to match and use capture group values of property value
- ⚠ considered if...
- HEAD is detached
git checkout <COMMIT>and no matching version tag is pointing to HEAD
- HEAD is detached
ℹ / characters within final version will be replaced by -**
-
${ref}- current ref name (branch name, tag name or commit hash)
-
${branch}(only available within branch configuration)- The branch name of
HEAD - e.g. 'master', 'feature/next-big-thing', ...
- The branch name of
-
${tag}(only available within tag configuration)- The tag name that points at
HEAD, if multiple tags point atHEADlatest version is selected - e.g. 'version/1.0.1', 'v1.2.3', ...
- The tag name that points at
-
${commit}- The
HEADcommit hash - e.g. '0fc20459a8eceb2c4abb9bf0af45a6e8af17b94b'
- The
-
${commit.short}- The short
HEADcommit hash (7 characters) - e.g. '0fc2045'
- The short
-
${commit.timestamp}- The
HEADcommit timestamp (epoch seconds) - e.g. '1560694278'
- The
-
${commit.timestamp.datetime}- The
HEADcommit timestamp formatted asyyyyMMdd.HHmmss - e.g. '20190616.161442'
- The
-
Pattern Groups- Contents of group in the regex pattern can be addressed by
group nameorgroup indexe.g. - Named Group Example
pattern = 'feature/(?<feature>.+)' versionFormat = '${feature}-SNAPSHOT'
- Group Index Example
pattern = 'v([0-9].*)' versionFormat = '${1}'
- Contents of group in the regex pattern can be addressed by
-
${version}versionset inpom.xml- e.g. '1.0.0-SNAPSHOT'
-
${version.release}versionset inpom.xmlwithout-SNAPSHOTpostfix- e.g. '1.0.0'
-
${property.name}- name of matching property
- Only available within property format.
-
${property.value}- value of matching property
- Only available within property format.
-
Disable Extension
- Environment Variables
export VERSIONING_DISABLE=true
- Command Line Parameters
maven ... -Dversioning.disable=true
- Environment Variables
-
Provide branch or tag name
- Environment Variables
export VERSIONING_GIT_BRANCH=$PROVIDED_BRANCH_NAMEexport VERSIONING_GIT_TAG=$PROVIDED_TAG_NAME
- Command Line Parameters
maven ... -Dgit.branch=$PROVIDED_BRANCH_NAMEmaven ... -Dgit.tag=$PROVIDED_TAG_NAME
ℹ Especially useful for CI builds see Miscellaneous Hints
- Environment Variables
-
Update
pom.xml- Environment Variables
export VERSIONING_UPDATE_POM=true
- Command Line Parameters
maven ... -Dversioning.updatePom=true
- Environment Variables
-
Prefer Tags for Versioning instead of Branches
- Environment Variables
export VERSIONING_PREFER_TAGS=true
- Command Line Parameters
maven ... -Dversioning.preferTags=true
- Environment Variables
git.commite.g. '0fc20459a8eceb2c4abb9bf0af45a6e8af17b94b'git.refvalue of branch of tag name, always setgit.branche.g. 'feature/next-big-thing', only set for branch versioninggit.tage.g. 'v1.2.3', only set for tag versioning
git.commit.timestampe.g. '1560694278'git.commit.timestamp.datetimee.g. '2019-11-16T14:37:10Z'git.dirtyrepository dirty state indictortrueorfalse
mvn --non-recursive exec:exec -Dexec.executable='echo' -Dexec.args='${project.version}' -q
The reproducible builds feature (https://maven.apache.org/guides/mini/guide-reproducible-builds.html) newly introduced in maven can be easily supported with this extension by using the latest commit timestamp as build timestamps.
<project.build.outputTimestamp>${git.commit.timestamp.datetime}</project.build.outputTimestamp>For a flawless experience you need to disable this extension during project import.
Disable it by adding -Dversioning.disable=true to Maven Importer VM options (Preferences > Build, Execution, Deployment > Build Tools > Maven > Importing > VM options for importer).
Most CI/CD systems do checkouts in a detached HEAD state so no branch information is available, however they provide environment variables with this information. You can provide those, by using Parameters & Environment Variables. Below you'll find some setup example for common CI/CD systems.
execute this snippet before running your maven command
before_script:
- if [ -n "$CI_COMMIT_TAG" ]; then
export VERSIONING_GIT_TAG=$CI_COMMIT_TAG;
else
export VERSIONING_GIT_BRANCH=$CI_COMMIT_REF_NAME;
fiexecute this snippet before running your maven command
if [[ "$GIT_BRANCH" = origin/tags/* ]]; then
export VERSIONING_GIT_TAG=${GIT_BRANCH#origin/tags/};
else
export VERSIONING_GIT_BRANCH=${GIT_BRANCH#origin/};
fi - mvn install
# run integration tests after install,
# integration tests will run with LATEST version of extension installed
- mvn failsafe:integration-test- simplify
<property>replacement configuration
- add missing dependency vor maven version 3.3
-
simplify
<property>replacement configurationnew config
<gitVersioning> <branch> <pattern>master</pattern> <versionFormat>${version}</versionFormat> <property> <pattern>revision</pattern> <valueFormat>${branch-SNAPSHOT}</valueFormat> </property> </branch> </gitVersioning>
old config
<gitVersioning> <branch> <pattern>master</pattern> <versionFormat>${version}</versionFormat> <property> <pattern>revision</pattern> <value> <format>${branch-SNAPSHOT}</format> </value> </property> </branch> </gitVersioning>
- fix verbose logging when disabling extension by flag
- restrict project versioning to root- and sub-projects
- provide
${git.dirty}project property
- set execution phase to INITIALIZE
- Fix IntelliJ multi-modules project handling.
- New Provided properties, see Provided Project Properties
git.commit.timestampgit.commit.timestamp.datetime
- Add parameters and environment variable to disable extension. see Parameters & Environment Variables
- Add config option(
<update>) to update version in original pom file. see Configure Extension
- Major Refactoring, Simplification
- Also available as Gradle Plugin
- New Provided Project Properties
git.refvalue of branch of tag name, always set
- Restructured XML Config
- renamed root tag
<configuration>-><gitVersioning> - removed nested structure
- see Configure Extension
- renamed root tag
- Renamed Environment Variables
MAVEN_PROJECT_BRANCH->VERSIONING_GIT_BRANCHMAVEN_PROJECT_TAG->VERSIONING_GIT_TAG
- Renamed Maven Parameters
-Dproject.branch->-Dgit.branch-Dproject.tag->-Dgit.tag
- Removed Maven Parameters
-DgitVersioning- disable the extension by a parameter is no longer supported
- Renamed Provided Project Properties
project.branch->git.branchproject.tag->git.tagproject.commit->git.commit
