Skip to content

Commit 5a79346

Browse files
authored
Fix UpdateMavenModel using stale projectPoms for child module resolution (#7307) (#7310)
When UpdateMavenModel re-resolved a POM after XML changes (e.g. parent version bump), the projectPoms map was built from the original marker hierarchy and still contained the old requested Pom. Child modules resolved recursively would therefore look up the stale root Pom and inherit dependency management from the old grandparent. Update the projectPoms map with the current requested Pom before passing it to updateResult(), so recursive child resolution sees the updated parent reference.
1 parent fcbae1c commit 5a79346

2 files changed

Lines changed: 22 additions & 2 deletions

File tree

rewrite-maven/src/main/java/org/openrewrite/maven/UpdateMavenModel.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,13 @@ public Xml visitDocument(Xml.Document document, P p) {
139139
}
140140

141141
try {
142+
Map<Path, Pom> projectPoms = resolutionResult.getProjectPoms();
143+
Path sourcePath = requested.getSourcePath();
144+
if (sourcePath != null) {
145+
projectPoms.put(sourcePath, requested);
146+
}
142147
MavenResolutionResult updated = updateResult(ctx, resolutionResult.withPom(resolutionResult.getPom().withRequested(requested)),
143-
resolutionResult.getProjectPoms());
148+
projectPoms);
144149
return document.withMarkers(document.getMarkers().computeByType(getResolutionResult(),
145150
(original, ignored) -> updated));
146151
} catch (MavenDownloadingExceptions e) {

rewrite-maven/src/test/java/org/openrewrite/maven/ChangeParentPomTest.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2429,7 +2429,15 @@ void submoduleParentModelDependencyManagementUpdated() {
24292429
</parent>
24302430
</project>
24312431
""",
2432-
spec -> spec.path("pom.xml")
2432+
spec -> spec.path("pom.xml").afterRecipe(doc -> {
2433+
MavenResolutionResult result = doc.getMarkers().findFirst(MavenResolutionResult.class).orElseThrow();
2434+
// Root's modules should also have updated dependency management
2435+
assertThat(result.getModules()).isNotEmpty();
2436+
MavenResolutionResult childModule = result.getModules().get(0);
2437+
assertThat(childModule.getPom().getDependencyManagement())
2438+
.describedAs("Root's child module should have new junit 6.0.1 entries in dependency management")
2439+
.anyMatch(dep -> dep.getGav().toString().equals("org.junit.jupiter:junit-jupiter:6.0.1"));
2440+
})
24332441
),
24342442
mavenProject(
24352443
"sample-rest",
@@ -2474,6 +2482,13 @@ void submoduleParentModelDependencyManagementUpdated() {
24742482
assertThat(result.getParent().getPom().getDependencyManagement())
24752483
.describedAs("Parent's dependency management should contain new junit 6.0.1 entries")
24762484
.anyMatch(dep -> dep.getGav().toString().equals("org.junit.jupiter:junit-jupiter:6.0.1"));
2485+
// Verify child's own resolved dependency management reflects the new grandparent
2486+
assertThat(result.getPom().getDependencyManagement())
2487+
.describedAs("Child's own dependency management should not contain old junit 5.10.3 entries")
2488+
.noneMatch(dep -> dep.getGav().toString().equals("org.junit.jupiter:junit-jupiter:5.10.3"));
2489+
assertThat(result.getPom().getDependencyManagement())
2490+
.describedAs("Child's own dependency management should contain new junit 6.0.1 entries")
2491+
.anyMatch(dep -> dep.getGav().toString().equals("org.junit.jupiter:junit-jupiter:6.0.1"));
24772492
})
24782493
)
24792494
)

0 commit comments

Comments
 (0)