Explain Codes LogoExplain Codes Logo

Updating version numbers of modules in a multi-module Maven project

java
mvn
version-management
maven-plugin
Anton ShumikhinbyAnton Shumikhin·Oct 9, 2024
TLDR

Flex your Maven skill and align your project's versions with the Versions Maven Plugin. Break the ice with this command:

mvn versions:set -DnewVersion=1.2.3

Update 1.2.3 to your target version and all the pom.xml files across your modules will synchronize. Seal the deal with a commit:

mvn versions:commit

If you tripped over a banana peel during the process, use this command to revert:

mvn versions:revert

To keep things neat and prevent forming backup POMs, add:

generateBackupPoms=false

The magic command wand: versions:set

The parent-child relationship in your POMs is the secret sauce for cohesive version updates. When updating the parent POM version, all submodules will follow suit. It's like playing "follow the leader"!

Increment versions in a snap

If manually updating version numbers is not your thing, let automation do the heavy lifting:

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.nextMinorVersion}.0 versions:commit

Put your feet up and watch build-helper-maven-plugin parse the current version and set the new version to the next minor increment — a surefire way to make versioning as breezy as a day at the beach!

Consistent versioning, wrapped with a ribbon

If your project is ready for grand unveiling, the Maven Release Plugin makes it a special event:

mvn release:update-versions

This command updates the versions to a release version or the next development version, maintaining the soiree's elegance theme.

Troubleshoot with flair

Put on your detective hat: if an update goes awry, the modelVersion in your POM could be the culprit. Inspect your project's inheritance and aggregation, and you might just crack the case!

The around-the-world journey to advanced version management

Be dynamic with placeholders

Placeholders, not just for holding places! They keep versions up-to-date in your module POMs:

<properties> <project.version>1.2.3</project.version> </properties>

Modules reference this valuable property:

<parent> <version>${project.version}</version> </parent>

So you can switch versions as you switch TV channels!

Handle non-standard scenarios like a pro

For multi-language projects or daredevil setups outside the norm, property-based versioning might seem like trying to fit a square peg in a round hole. Don't panic—custom scripts or plugin configuration tweaks can be your lifeline!

Sidestep common mishaps

Avoid these potholes:

  • Hard-coding versions in sub-module POMs.
  • Forgetting to commit or push version changes (Ouch! That could hurt!).
  • Running mvn versions:set without -DnewVersion, which summons manual input and puts you at risk of human error (spoiler alert: typos!).