diff --git a/maven-core/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java b/maven-core/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java index 4c7476bdc162..b8f2d89ae0e5 100644 --- a/maven-core/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java +++ b/maven-core/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java @@ -18,6 +18,8 @@ */ package org.apache.maven.toolchain; +import java.util.regex.Pattern; + import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; @@ -66,7 +68,7 @@ private VersionMatcher(String version) { @Override public boolean matches(String requirement) { try { - VersionRange range = VersionRange.createFromVersionSpec(requirement); + VersionRange range = convertRequirementToVersionRange(requirement); if (range.hasRestrictions()) { return range.containsVersion(version); } else { @@ -79,6 +81,29 @@ public boolean matches(String requirement) { } } + private VersionRange convertRequirementToVersionRange(String requirement) + throws InvalidVersionSpecificationException { + // Specific for Version _requirement_ matching; + // If the version is a simple integer (like "25") + // then treat this as the requirement "the major version is 25" + if (Pattern.matches("^[0-9]+$", requirement)) { + int majorVersion = Integer.parseInt(requirement); + return VersionRange.createFromVersionSpec("[" + majorVersion + "," + (majorVersion + 1) + ")"); + } + + // If the version is a major.minor (like "1.5") + // then treat this as the requirement "the major version is 1 and the minor is 5" + if (Pattern.matches("^[0-9]\\.[0-9]+$", requirement)) { + String[] split = requirement.split("\\.", 2); + int majorVersion = Integer.parseInt(split[0]); + int minorVersion = Integer.parseInt(split[1]); + return VersionRange.createFromVersionSpec( + "[" + majorVersion + "." + minorVersion + "," + majorVersion + "." + (minorVersion + 1) + ")"); + } + + return VersionRange.createFromVersionSpec(requirement); + } + @Override public String toString() { return version.toString(); diff --git a/maven-core/src/test/java/org/apache/maven/toolchain/RequirementMatcherFactoryTest.java b/maven-core/src/test/java/org/apache/maven/toolchain/RequirementMatcherFactoryTest.java index 6b9cc2d8003d..083e9b260e19 100644 --- a/maven-core/src/test/java/org/apache/maven/toolchain/RequirementMatcherFactoryTest.java +++ b/maven-core/src/test/java/org/apache/maven/toolchain/RequirementMatcherFactoryTest.java @@ -50,11 +50,18 @@ public void testCreateExactMatcher() { public void testCreateVersionMatcher() { RequirementMatcher matcher; matcher = RequirementMatcherFactory.createVersionMatcher("1.5.2"); - assertFalse(matcher.matches("1.5")); - assertTrue(matcher.matches("1.5.2")); + assertTrue(matcher.matches("1")); // Major matches + assertTrue(matcher.matches("1.5")); // Major.Minor matches + assertTrue(matcher.matches("1.5.2")); // Full match + assertFalse(matcher.matches("1.6")); // Wrong minor + assertFalse(matcher.matches("2")); // Wrong major + assertFalse(matcher.matches("2.5")); // Wrong major, right minor assertFalse(matcher.matches("[1.4,1.5)")); assertFalse(matcher.matches("[1.5,1.5.2)")); + assertTrue(matcher.matches("[1.5,1.5.3)")); + assertTrue(matcher.matches("(1.5.1,1.6)")); assertFalse(matcher.matches("(1.5.2,1.6)")); + assertTrue(matcher.matches("[1.5.2,1.6)")); assertTrue(matcher.matches("(1.4,1.5.2]")); assertTrue(matcher.matches("(1.5,)")); assertEquals("1.5.2", matcher.toString());