Semver4j
This is an active copy of great semver4j library created by @vdurmont, which is no longer maintained ๐ญ
Semver4j is a lightweight Java library that helps you to handle versions.
It follows the rules of the semantic versioning specification.
It also provides several range checking support: node-semver,
CocoaPods
and Ivy.
Installation
Add the dependency to your project:
Using Maven
<dependency>
<groupId>org.semver4j</groupId>
<artifactId>semver4j</artifactId>
<version>2.1.1</version>
</dependency>Using Gradle
implementation 'org.semver4j:semver4j:2.1.1'
Version v1.0.x references to original library version v3.1.0 in source repository.
Usage
What is a version?
In Semver4j, a version looks like: 1.2.3-beta.4+sha899d8g79f87.
1is the major part (required)2is the minor part (required)3is the patch part (required)betaand4are the pre-release version (optional)sha899d8g79f87is the build metadata (optional)
The Semver object
You can create Semver object in number of ways.
Using constructor
Semver version = new Semver("1.2.3-beta.4+sha899d8g79f87");Using Semver.parse() method
Semver version = Semver.parse("1.2.3-beta.4+sha899d8g79f87"); // returns correct Semver object
Semver version = Semver.parse("invalid"); // returns null, cannot parse this versionUsing Semver.coerce() method
Library can help you to create valid Semver object when the version is not valid. This aims to provide forgiving
translation from not-semver into semver.
Semver version = Semver.coerce("..1"); // it produces the same result as new Semver("1.0.0)If the version is invalid, a SemverException will be thrown.
Is the version stable?
You can check if you're working with a stable version by using isStable().
A version is stable if its major number is strictly positive, and it has no pre-release version.
Examples:
// true
new Semver("1.2.3").isStable(); // major is > 0 and has no pre-release version
new Semver("1.2.3+sHa.0nSFGKjkjsdf").isStable(); // major is > 0 and has only build metadata without pre-release version
// false
new Semver("0.1.2").isStable()); // major is < 1
new Semver("0.1.2+sHa.0nSFGKjkjsdf").isStable(); // major is < 1
new Semver("1.2.3-BETA.11+sHa.0nSFGKjkjsdf").isStable(); // major is > 0 but has pre-release version BETA.11Comparing the versions
isGreaterThan()returns true if the version is strictly greater than the other one.
Semver version = new Semver("1.2.3");
version.isGreaterThan("1.2.2"); // true
version.isGreaterThan("1.2.4"); // false
version.isGreaterThan("1.2.3"); // falseisLowerThan()returns true if the version is strictly lower than the other one.
Semver version = new versionver("1.2.3");
version.isLowerThan("1.2.2"); // false
version.isLowerThan("1.2.4"); // true
version.isLowerThan("1.2.3"); // falseisEqualTo()returns true if the versions are exactly the same.
Semver version = new Semver("1.2.3+sha123456789");
version.isEqualTo("1.2.3+sha123456789"); // true
version.isEqualTo("1.2.3+shaABCDEFGHI"); // falseisEquivalentTo()returns true if the versions are the same (does not take the build metadata into account).
Semver version = new Semver("1.2.3+sha123456789");
version.isEquivalentTo("1.2.3+sha123456789"); // true
version.isEquivalentTo("1.2.3+shaABCDEFGHI"); // trueVersions diffs
If you want to know what is the main difference between 2 versions, use the diff() method.
It will return a VersionDiff enum value among: NONE, MAJOR, MINOR, PATCH, SUFFIX, BUILD.
It will always return the biggest difference.
Semver version = new Semver("1.2.3-beta.4+sha899d8g79f87");
version.diff("1.2.3-beta.4+sha899d8g79f87"); // NONE
version.diff("2.3.4-alpha.5+sha32iddfu987"); // MAJOR
version.diff("1.3.4-alpha.5+sha32iddfu987"); // MINOR
version.diff("1.2.4-alpha.5+sha32iddfu987"); // PATCH
version.diff("1.2.3-alpha.5+sha32iddfu987"); // SUFFIX
version.diff("1.2.3-beta.4+sha32iddfu987"); // BUILDRanges
If you want to check if a version satisfies a range, use the satisfies() method.
Semver4j can interpret following range implementations:
- NPM
- Primitive ranges
<,<=,>,>=and= - Hyphen ranges
X.Y.Z - A.B.C - X-Ranges
1.2.x,1.X,1.2.*and* - Tilde ranges
~1.2.3,~1.2and~1 - Caret ranges
^1.2.3,^0.2.5and^0.0.4
- Primitive ranges
- CocaPods
- Optimistic operator
~> 1.0
- Optimistic operator
- Ivy
- Version Range Matcher
[1.0,2.0],[1.0,2.0[,]1.0,2.0],]1.0,2.0[,[1.0,),]1.0,),(,2.0]
and(,2.0[
- Version Range Matcher
Modifying the version
The Semver object is immutable. However, it provides a set of methods that will help you create new versions:
withIncMajor()andwithIncMajor(int increment)returns aSemverobject with the major part incrementedwithIncMinor()andwithIncMinor(int increment)returns aSemverobject with the minor part incrementedwithIncPatch()andwithIncPatch(int increment)returns aSemverobject with the patch part incrementedwithClearedPreRelease()returns aSemverobject with no pre-release versionwithClearedBuild()returns aSemverobject with no build metadata
You can also use built-in versioning methods such as:
nextMajor():1.2.3-beta.4+sha32iddfu987 => 2.0.0nextMinor():1.2.3-beta.4+sha32iddfu987 => 1.3.0nextPatch():1.2.3-beta.4+sha32iddfu987 => 1.2.4
Contributing
Any pull request or bug report are welcome!
If you have any suggestion about new features, you can open an issue.
Thanks
Logo created by Tomek Babik @tomekbbk.