This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch maven-4.0.x
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/maven-4.0.x by this push:
     new f52d3cae6a Fix #12085: add regression tests for version inheritance 
from remote parent (#12101)
f52d3cae6a is described below

commit f52d3cae6aa05fdcf7616cefc678dd6cff9a4757
Author: Guillaume Nodet <[email protected]>
AuthorDate: Tue May 19 15:36:16 2026 +0200

    Fix #12085: add regression tests for version inheritance from remote parent 
(#12101)
    
    The issue reported a null root artifact error when building projects
    that inherit version from a remote parent POM. Investigation showed
    the actual cause was uninterpolated repository expressions leaking
    through to the CollectRequest validator, which was already fixed by
    commits 9332ad3d55 and cee3c33c74.
    
    Add regression tests covering both single-project and multi-module
    builds with version inherited from a remote parent POM (different
    groupId, empty relativePath).
    
    Co-authored-by: Claude Opus 4.6 <[email protected]>
---
 .../project/DefaultMavenProjectBuilderTest.java    | 39 ++++++++++++++++++++++
 .../org/test/parent-pom/1.0/parent-pom-1.0.pom     | 31 +++++++++++++++++
 .../child/pom.xml                                  | 12 +++++++
 .../pom.xml                                        | 10 ++++++
 .../parent-version-inherited-from-remote/pom.xml   | 12 +++++++
 5 files changed, 104 insertions(+)

diff --git 
a/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java
 
b/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java
index 1c11ba4efb..d1ebc359a9 100644
--- 
a/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java
+++ 
b/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java
@@ -587,4 +587,43 @@ public void testEmptyModulesElementPreventsDiscovery() 
throws Exception {
         // The modules list should be empty since we explicitly defined an 
empty <modules /> element
         assertTrue(parent.getModel().getDelegate().getModules().isEmpty());
     }
+
+    @Test
+    void testVersionInheritedFromRemoteParent() throws Exception {
+        File f1 = 
getTestFile("src/test/resources/projects/parent-version-inherited-from-remote/pom.xml");
+        MavenProject project = getProject(f1);
+
+        assertNotNull(project, "project should not be null");
+        assertEquals("1.0", project.getVersion(), "version should be inherited 
from remote parent");
+        assertNotNull(project.getArtifact(), "project artifact should not be 
null");
+        assertEquals("1.0", project.getArtifact().getVersion(), "artifact 
version should match inherited version");
+        assertEquals("org.different.group", project.getGroupId(), "groupId 
should be from child POM");
+        assertEquals("child-project", project.getArtifactId(), "artifactId 
should be from child POM");
+    }
+
+    @Test
+    void testVersionInheritedFromRemoteParentMultiModule() throws Exception {
+        File pom = 
getTestFile("src/test/resources/projects/parent-version-inherited-from-remote-multimodule/pom.xml");
+        ProjectBuildingRequest configuration = newBuildingRequest();
+        InternalSession internalSession = 
InternalSession.from(configuration.getRepositorySession());
+        InternalMavenSession mavenSession = 
InternalMavenSession.from(internalSession);
+        mavenSession
+                .getMavenSession()
+                .getRequest()
+                .setRootDirectory(pom.toPath().getParent());
+
+        List<ProjectBuildingResult> results = 
projectBuilder.build(List.of(pom), true, configuration);
+        assertEquals(2, results.size());
+
+        MavenProject child = results.stream()
+                .map(ProjectBuildingResult::getProject)
+                .filter(p -> "child-project".equals(p.getArtifactId()))
+                .findFirst()
+                .orElse(null);
+        assertNotNull(child, "child project should be found");
+        assertEquals("1.0", child.getVersion(), "version should be inherited 
from remote parent");
+        assertNotNull(child.getArtifact(), "child project artifact should not 
be null");
+        assertEquals("1.0", child.getArtifact().getVersion(), "artifact 
version should match inherited version");
+        assertEquals("org.different.group", child.getGroupId(), "groupId 
should be from child POM");
+    }
 }
diff --git 
a/impl/maven-core/src/test/remote-repo/org/test/parent-pom/1.0/parent-pom-1.0.pom
 
b/impl/maven-core/src/test/remote-repo/org/test/parent-pom/1.0/parent-pom-1.0.pom
new file mode 100644
index 0000000000..fd93eabf47
--- /dev/null
+++ 
b/impl/maven-core/src/test/remote-repo/org/test/parent-pom/1.0/parent-pom-1.0.pom
@@ -0,0 +1,31 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.test</groupId>
+  <artifactId>parent-pom</artifactId>
+  <version>1.0</version>
+  <packaging>pom</packaging>
+
+  <repositories>
+    <repository>
+      <id>staging</id>
+      <url>https://repository.example.org/staging</url>
+    </repository>
+  </repositories>
+
+  <profiles>
+    <profile>
+      <id>nightly</id>
+      <activation>
+        <property>
+          <name>nightly</name>
+        </property>
+      </activation>
+      <repositories>
+        <repository>
+          <id>${uninterpolatedRepoId}</id>
+          <url>file://${SNAPSHOTS_PATH}</url>
+        </repository>
+      </repositories>
+    </profile>
+  </profiles>
+</project>
diff --git 
a/impl/maven-core/src/test/resources/projects/parent-version-inherited-from-remote-multimodule/child/pom.xml
 
b/impl/maven-core/src/test/resources/projects/parent-version-inherited-from-remote-multimodule/child/pom.xml
new file mode 100644
index 0000000000..d3c99a4c88
--- /dev/null
+++ 
b/impl/maven-core/src/test/resources/projects/parent-version-inherited-from-remote-multimodule/child/pom.xml
@@ -0,0 +1,12 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.test</groupId>
+    <artifactId>parent-pom</artifactId>
+    <version>1.0</version>
+    <relativePath/>
+  </parent>
+  <groupId>org.different.group</groupId>
+  <artifactId>child-project</artifactId>
+  <!-- no version - inherited from remote parent -->
+</project>
diff --git 
a/impl/maven-core/src/test/resources/projects/parent-version-inherited-from-remote-multimodule/pom.xml
 
b/impl/maven-core/src/test/resources/projects/parent-version-inherited-from-remote-multimodule/pom.xml
new file mode 100644
index 0000000000..80cfd216d3
--- /dev/null
+++ 
b/impl/maven-core/src/test/resources/projects/parent-version-inherited-from-remote-multimodule/pom.xml
@@ -0,0 +1,10 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.test.aggregator</groupId>
+  <artifactId>aggregator</artifactId>
+  <version>1.0</version>
+  <packaging>pom</packaging>
+  <modules>
+    <module>child</module>
+  </modules>
+</project>
diff --git 
a/impl/maven-core/src/test/resources/projects/parent-version-inherited-from-remote/pom.xml
 
b/impl/maven-core/src/test/resources/projects/parent-version-inherited-from-remote/pom.xml
new file mode 100644
index 0000000000..96a5d7325f
--- /dev/null
+++ 
b/impl/maven-core/src/test/resources/projects/parent-version-inherited-from-remote/pom.xml
@@ -0,0 +1,12 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.test</groupId>
+    <artifactId>parent-pom</artifactId>
+    <version>1.0</version>
+    <relativePath/>
+  </parent>
+  <groupId>org.different.group</groupId>
+  <artifactId>child-project</artifactId>
+  <!-- no version - inherited from parent -->
+</project>

Reply via email to