Prepare a Release

release:prepare goal ensures the project is ready to be released and then prepares SCM to eventually contain a tagged version of the release. This is expected to be followed by a call to release:perform.

Preparing a release goes through the following release phases by default:

  • Check that there are no uncommitted changes in the sources
  • Check that there are no SNAPSHOT dependencies
  • Change the version in the POMs from x-SNAPSHOT to a new release version (you will be prompted for the versions to use, with a default value proposed by version policy configured as projectVersionPolicyId)
  • Transform the SCM information in the POM to include the final destination of the tag
  • Run the project tests (preparation goals) against the modified POMs to confirm everything is in working order
  • Commit the modified POMs
  • Tag the code in the SCM with a version name (this will be prompted for)
  • Bump the version in the POMs to a new value y-SNAPSHOT (these values will also be prompted for, with a default value proposed by version policy configured as projectVersionPolicyId)
  • Eventually run completion goal(s) against the project (since 2.2)
  • Commit the modified POMs

To prepare a release execute this command:

mvn release:prepare

Note: If an error occurs, or the process is cancelled, then running this command again will pick up from where the last one left off.

If you wish to start again, use:

mvn release:prepare -Dresume=false

Alternatively, you can use:

mvn release:clean release:prepare

Note: If any changes have been made to your source files they might need to be reverted before you restart the prepare process. You can use release:rollback to make the plugin do it for you.

Multi-module projects

You will be prompted for the version number for each module of the project. If you prefer that every module gets the same version as the parent POM, you can set the option autoVersionSubmodules to true. Now you will be asked only once for the release version and the next development version.

Generating release POMs

It is possible to generate a release-pom.xml file for each project that contains the fully resolved project used at release time as a record for later. As of the 2.0 release, this requires calling an alternate goal:

mvn release:prepare-with-pom

This goal is equivalent to the release:prepare goal, except that it requires a previous build of the project to exist to properly populate the release-pom.xml files.

Overriding the default tag name format

By default, if you do not specify a tag name, a default tag name of artifactId-version will be suggested (and used if running non-interactively).

You can override proposed value with the exact tag name to use from the command line by passing the tag property (-Dtag=my-tag). If you want to have the tag name generated, but just change the default pattern, you can use the tagNameFormat configuration option.

For example to have the tag name default to the version number prefixed with a v you could configure your pom like so:

<project>
  [...]
  <build>
    [...]
    <plugins>
      [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
        <version>3.1.1</version>
        <configuration>
          <tagNameFormat>v@{project.version}</tagNameFormat>
        </configuration>
      </plugin>
      [...]
    </plugins>
    [...]
  </build>
  [...]
</project>

The tagNameFormat uses @{ and } as delimiters in order to ensure that the default Maven property interpolation does not substitute the values before the version transformation has taken place.

The following properties are supported:

  • project.groupId which corresponds to the project's groupId.
  • project.artifactId which corresponds to the project's artifactId.
  • project.version which corresponds to the project's release version.

The project. prefix is optional and may be omitted.

Overriding proposed release and next development versions

The Release Plugin automatically calculates the versions that are proposed for the release and the next development version (i.e. the next SNAPSHOT).

The default VersionPolicy compares and increments versions for a common java versioning scheme: the proposed release version is the current version without -SNAPSHOT, and the proposed next development version is a minor increment to the release with -SNAPSHOT.

It is possible to select a different VersionPolicy by specifying its id:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
        <version>3.1.1</version>
        <configuration>
          <projectVersionPolicyId>SemVerVersionPolicy</projectVersionPolicyId>
        </configuration>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>

There are 3 VersionPolicies bundled with the Release Plugin:

  • default: increments versions for a common java versioning scheme,
  • OddEvenVersionPolicy: even version numbers for releases, and odd version numbers for development (see javadoc),
  • SemVerVersionPolicy: enforce SemVer format and increase minor element when resolving the development version (see javadoc).