I proposed a new versioning scheme to yield a unique version string for each artifact in our highly modularised Maven java application.
Currently we are running a classic SemVer semantic verioning system.
The only shortcoming I can see with SemVer is that it is not globally unique.
In the Maven world the version is combined with the artifactId and the groupId to create a globally unique token, but because this is within an XML based Project Object Model (POM) file it is fairly difficult to get that token out without buying into the whole toolchain. As Maven allows ranges (don't use ranges) and inheritance it is practically impossible for mortals to parse a pom correctly.
What problem are we trying to solve?
We want to be able to edit all poms across our collection with a single command to ensure that each version is completely deployed and we have no version clash. We have developed a tool to make the Maven Dependency Tree readable which has allowed us to see how often the team make a change but do not fully roll it out.
The problem we are trying to solve is how to update all usages of an artifact every time it is updated, ensuring we never run with a mixture of versions (almost like a Monolith).
In the wider open source community it is not the responsibility of the library writer to ensure that every usage is updated to the latest version but within an enterprise it is.
Initial proposal
My first proposal, prepending the semantic version number with a unique code for the library, looked good:
SMD110-3.0.8
This system would work if we had started with this or if we were to backfill all previous versions, however we are proposing a change only to new versions and we have to ensure that the new versioing system will play nicely with the existing versions.
By play nicely I mean that SMD110-3.0.8 should be understood to be more recent than 3.0.7.
I had planned to test this by trial and error but then I thought to actually write a test.
Testing the proposal
I found the Maven verson comparison code and wrote some tests.
The tests revealed my assumption to be incorrect (whether this is a bug or not I am not sure), but the tests enabled me to propose a schema change which did play nicely:
@Test
public void workableNextYearNewOldComparisonTest() {
ComparableVersion it = new ComparableVersion("2025-SMD130-2.0.7");
ComparableVersion previous = new ComparableVersion("2024-SMD130-2.0.6");
assertTrue(it.compareTo(previous) > 0);
assertTrue(previous.compareTo(previous) == 0);
assertTrue(previous.compareTo(it) < 0);
}
Revised proposal
Prepending the initial proposal with the year is an improvement, the year of publication is useful and it works with the tooling:
<year>-<artefact code>-<semantic version>
2024-SMD110-3.0.8
Test your assumptions, it is easier than trial and error!