Maven Artifact API provides core interfaces and classes for representing and working with Maven artifacts, including version handling, repository interactions, and metadata management
—
Maven's version management system provides sophisticated capabilities for parsing, comparing, and working with software version numbers. It supports Maven's versioning conventions including snapshot versions, qualifier handling, and version range specifications.
Generic version comparison implementation that handles Maven's complex version semantics.
public class ComparableVersion implements Comparable<ComparableVersion> {
public ComparableVersion(String version);
public int compareTo(ComparableVersion other);
public String getCanonical();
public String toString();
public boolean equals(Object other);
public int hashCode();
// CLI utility for testing version comparisons
public static void main(String... args);
}Usage Examples:
// Basic version comparison
ComparableVersion v1 = new ComparableVersion("1.0");
ComparableVersion v2 = new ComparableVersion("1.0.1");
int result = v1.compareTo(v2); // Returns -1 (v1 < v2)
// Snapshot versions
ComparableVersion snapshot = new ComparableVersion("1.0-SNAPSHOT");
ComparableVersion release = new ComparableVersion("1.0");
int comparison = snapshot.compareTo(release); // Returns -1 (snapshot < release)
// Complex versions with qualifiers
ComparableVersion alpha = new ComparableVersion("1.0-alpha");
ComparableVersion beta = new ComparableVersion("1.0-beta");
ComparableVersion rc = new ComparableVersion("1.0-rc");
ComparableVersion final = new ComparableVersion("1.0");
// alpha < beta < rc < final
// Get canonical representation
String canonical = new ComparableVersion("1.0.0").getCanonical(); // "1"Constructs and manages version ranges for dependency specifications.
public class VersionRange {
// Factory methods
public static VersionRange createFromVersionSpec(String spec)
throws InvalidVersionSpecificationException;
public static VersionRange createFromVersion(String version);
// Range operations
public ArtifactVersion getRecommendedVersion();
public List<Restriction> getRestrictions();
public VersionRange restrict(VersionRange restriction)
throws OverConstrainedVersionException;
// Version matching
public boolean containsVersion(ArtifactVersion version);
public ArtifactVersion matchVersion(List<ArtifactVersion> versions);
// Artifact-specific operations
public ArtifactVersion getSelectedVersion(Artifact artifact);
public boolean isSelectedVersionKnown(Artifact artifact);
// Standard methods
public String toString();
public boolean equals(Object other);
public int hashCode();
}Usage Examples:
// Create version ranges
VersionRange range1 = VersionRange.createFromVersionSpec("[1.0,2.0)"); // 1.0 <= version < 2.0
VersionRange range2 = VersionRange.createFromVersionSpec("(,1.0]"); // version <= 1.0
VersionRange range3 = VersionRange.createFromVersionSpec("[1.0,)"); // version >= 1.0
// Single version
VersionRange exact = VersionRange.createFromVersion("1.0.0");
// Check if version matches range
boolean matches = range1.containsVersion(new DefaultArtifactVersion("1.5")); // true
boolean matches2 = range1.containsVersion(new DefaultArtifactVersion("2.0")); // false
// Find best matching version
List<ArtifactVersion> available = Arrays.asList(
new DefaultArtifactVersion("0.9"),
new DefaultArtifactVersion("1.2"),
new DefaultArtifactVersion("1.8"),
new DefaultArtifactVersion("2.1")
);
ArtifactVersion best = range1.matchVersion(available); // Returns "1.8"
// Combine ranges (intersection)
VersionRange combined = range1.restrict(range3); // [1.0,2.0)Describes artifact version components for detailed version analysis.
public interface ArtifactVersion extends Comparable<ArtifactVersion> {
int getMajorVersion();
int getMinorVersion();
int getIncrementalVersion();
int getBuildNumber();
String getQualifier();
void parseVersion(String version);
int compareTo(ArtifactVersion other);
String toString();
}Default implementation of artifact versioning with component parsing.
public class DefaultArtifactVersion implements ArtifactVersion {
public DefaultArtifactVersion(String version);
public int getMajorVersion();
public int getMinorVersion();
public int getIncrementalVersion();
public int getBuildNumber();
public String getQualifier();
public void parseVersion(String version);
public int compareTo(ArtifactVersion other);
public String toString();
public boolean equals(Object other);
public int hashCode();
}Usage Examples:
// Parse version components
DefaultArtifactVersion version = new DefaultArtifactVersion("1.2.3-beta-4");
int major = version.getMajorVersion(); // 1
int minor = version.getMinorVersion(); // 2
int incremental = version.getIncrementalVersion(); // 3
int build = version.getBuildNumber(); // 4
String qualifier = version.getQualifier(); // "beta"
// Compare versions
DefaultArtifactVersion v1 = new DefaultArtifactVersion("1.0.0");
DefaultArtifactVersion v2 = new DefaultArtifactVersion("1.0.1");
int comparison = v1.compareTo(v2); // Returns -1Describes version range restrictions with bounds and inclusivity.
public class Restriction {
public static final Restriction EVERYTHING;
public ArtifactVersion getLowerBound();
public ArtifactVersion getUpperBound();
public boolean isLowerBoundInclusive();
public boolean isUpperBoundInclusive();
public boolean containsVersion(ArtifactVersion version);
public String toString();
public boolean equals(Object other);
public int hashCode();
}Usage Examples:
// Get restrictions from version range
VersionRange range = VersionRange.createFromVersionSpec("[1.0,2.0)");
List<Restriction> restrictions = range.getRestrictions();
for (Restriction restriction : restrictions) {
ArtifactVersion lower = restriction.getLowerBound(); // 1.0
ArtifactVersion upper = restriction.getUpperBound(); // 2.0
boolean lowerInclusive = restriction.isLowerBoundInclusive(); // true
boolean upperInclusive = restriction.isUpperBoundInclusive(); // false
// Test if version fits restriction
boolean fits = restriction.containsVersion(new DefaultArtifactVersion("1.5")); // true
}
// Unrestricted range
Restriction everything = Restriction.EVERYTHING;Thrown when version specification string cannot be parsed.
public class InvalidVersionSpecificationException extends Exception {
public InvalidVersionSpecificationException(String message);
public InvalidVersionSpecificationException(String message, Throwable cause);
}Common Causes:
"[1.0,2.0" (missing closing bracket)"1..0""[2.0,1.0]" (lower > upper)Thrown when version ranges cannot be satisfied or are contradictory.
public class OverConstrainedVersionException extends ArtifactResolutionException {
public OverConstrainedVersionException(String message, Artifact artifact);
public OverConstrainedVersionException(String message, Artifact artifact,
List<ArtifactRepository> remoteRepositories);
}Common Scenarios:
[1.0,1.5] intersected with [2.0,3.0]Maven supports several version range syntaxes:
| Specification | Meaning |
|---|---|
1.0 | Recommended version (soft requirement) |
[1.0] | Exactly version 1.0 |
[1.0,2.0) | 1.0 <= version < 2.0 |
[1.0,2.0] | 1.0 <= version <= 2.0 |
(,1.0] | version <= 1.0 |
[1.2,) | version >= 1.2 |
(,1.0],[1.2,) | version <= 1.0 or version >= 1.2 |
Bracket Meanings:
[ and ] indicate inclusive bounds( and ) indicate exclusive boundsMaven version comparison follows these rules:
alpha < beta < milestone < rc < snapshot < (no qualifier) < spThe ComparableVersion class includes a main method for command-line version comparison:
java -cp maven-artifact-3.9.11.jar org.apache.maven.artifact.versioning.ComparableVersion 1.0 1.0.1
# Output: Display result: 1.0 < 1.0.1This is useful for testing version comparison behavior and debugging version ordering issues.
Install with Tessl CLI
npx tessl i tessl/maven-org-apache-maven--maven-artifact