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");

Reply via email to