This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/master by this push: new de639c15ec Add Maven version to error message when rejecting model versions (#10921) de639c15ec is described below commit de639c15ecf3b71632c0a6b7aec2a295c2805364 Author: Guillaume Nodet <gno...@gmail.com> AuthorDate: Wed Jul 16 18:01:41 2025 +0200 Add Maven version to error message when rejecting model versions (#10921) Port https://github.com/apache/maven/pull/10899 to master, using Session.getMavenVersion() instead of reading properties file. - Modified validateModelVersion() to accept Session parameter and include Maven version in error messages - Updated error messages to be single-line and consistent with Maven's style - Enhanced error messages show which Maven version is rejecting the model version - Added test coverage to verify Maven version is included in error messages This helps users (especially IDE users like NetBeans) understand version compatibility issues more clearly. --- .../maven/impl/model/DefaultModelValidator.java | 37 ++++++++++++++++------ .../impl/model/DefaultModelValidatorTest.java | 21 ++++++++++++ 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelValidator.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelValidator.java index 576ef1bf23..986a330e0d 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelValidator.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelValidator.java @@ -372,7 +372,7 @@ public void validateFileModel(Session s, Model m, int validationLevel, ModelProb } else if (validationLevel >= ModelValidator.VALIDATION_LEVEL_MAVEN_2_0) { validateStringNotEmpty("modelVersion", problems, Severity.ERROR, Version.V20, m.getModelVersion(), m); - validateModelVersion(problems, m.getModelVersion(), m, ModelBuilder.KNOWN_MODEL_VERSIONS); + validateModelVersion(s, problems, m.getModelVersion(), m, ModelBuilder.KNOWN_MODEL_VERSIONS); Set<String> modules = new HashSet<>(); for (int i = 0, n = m.getModules().size(); i < n; i++) { @@ -1956,19 +1956,23 @@ private boolean validateEnum( @SuppressWarnings("checkstyle:parameternumber") private boolean validateModelVersion( - ModelProblemCollector problems, String string, InputLocationTracker tracker, List<String> validVersions) { - if (string == null || string.isEmpty()) { + Session session, + ModelProblemCollector problems, + String requestedModel, + InputLocationTracker tracker, + List<String> validVersions) { + if (requestedModel == null || requestedModel.isEmpty()) { return true; } - if (validVersions.contains(string)) { + if (validVersions.contains(requestedModel)) { return true; } boolean newerThanAll = true; boolean olderThanAll = true; for (String validValue : validVersions) { - final int comparison = compareModelVersions(validValue, string); + final int comparison = compareModelVersions(validValue, requestedModel); newerThanAll = newerThanAll && comparison < 0; olderThanAll = olderThanAll && comparison > 0; } @@ -1980,8 +1984,10 @@ private boolean validateModelVersion( Version.V20, "modelVersion", null, - "of '" + string + "' is newer than the versions supported by this version of Maven: " - + validVersions + ". Building this project requires a newer version of Maven.", + "of '" + requestedModel + "' is newer than the versions supported by this Maven version (" + + getMavenVersionString(session) + + "). Supported modelVersions are: " + validVersions + + ". Building this project requires a newer version of Maven.", tracker); } else if (olderThanAll) { @@ -1992,8 +1998,10 @@ private boolean validateModelVersion( Version.V20, "modelVersion", null, - "of '" + string + "' is older than the versions supported by this version of Maven: " - + validVersions + ". Building this project requires an older version of Maven.", + "of '" + requestedModel + "' is older than the versions supported by this Maven version (" + + getMavenVersionString(session) + + "). Supported modelVersions are: " + validVersions + + ". Building this project requires an older version of Maven.", tracker); } else { @@ -2003,13 +2011,22 @@ private boolean validateModelVersion( Version.V20, "modelVersion", null, - "must be one of " + validVersions + " but is '" + string + "'.", + "must be one of " + validVersions + " but is '" + requestedModel + "'.", tracker); } return false; } + private String getMavenVersionString(Session session) { + try { + return session.getMavenVersion().toString(); + } catch (Exception e) { + // Fallback for test contexts where RuntimeInformation might not be available + return "unknown"; + } + } + /** * Compares two model versions. * diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelValidatorTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelValidatorTest.java index 6dc7a05851..70e12c6689 100644 --- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelValidatorTest.java +++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelValidatorTest.java @@ -23,6 +23,7 @@ import java.util.Collection; import java.util.List; +import org.apache.maven.api.Version; import org.apache.maven.api.model.Model; import org.apache.maven.api.services.model.ModelValidator; import org.apache.maven.impl.InternalSession; @@ -130,6 +131,11 @@ void setUp() throws Exception { when(repoSession.getScopeManager()).thenReturn(scopeManager); session = mock(InternalSession.class); when(session.getSession()).thenReturn(repoSession); + + // Mock Maven version for error message testing + Version mavenVersion = mock(Version.class); + when(mavenVersion.toString()).thenReturn("4.0.0-test"); + when(session.getMavenVersion()).thenReturn(mavenVersion); } @AfterEach @@ -170,6 +176,21 @@ void testModelVersionMessage() throws Exception { assertTrue(result.getErrors().get(0).contains("'modelVersion' must be one of")); } + @Test + void testModelVersionMessageIncludesMavenVersion() throws Exception { + SimpleProblemCollector result = validateFile("bad-modelVersion.xml"); + + assertViolations(result, 1, 0, 0); + + String errorMessage = result.getFatals().get(0); + assertTrue(errorMessage.contains("modelVersion")); + // Should include Maven version (either "4.0.0-test" from mock or "unknown" as fallback) + assertTrue( + errorMessage.contains("4.0.0-test") || errorMessage.contains("unknown"), + "Error message should include Maven version: " + errorMessage); + assertTrue(errorMessage.contains("newer than the versions supported by this Maven version")); + } + @Test void testMissingArtifactId() throws Exception { SimpleProblemCollector result = validate("missing-artifactId-pom.xml");