From 5b3ddd819ba50a9a4d4fe426c08ce5249f3ba4ea Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Thu, 26 Feb 2026 12:52:05 +0100 Subject: [PATCH 1/2] `addVersionIfMissing` should not add version when managed by pluginManagement When `addVersionIfMissing` is true, `UpgradePluginVersion` now checks whether the plugin already has a version managed via `` (local or inherited from a parent POM) before adding an explicit `` tag. This prevents unwanted version additions in child modules that inherit their plugin version from a parent. Fixes https://github.com/openrewrite/rewrite-migrate-java/issues/992 --- .../maven/UpgradePluginVersion.java | 39 ++++++--- .../maven/UpgradePluginVersionTest.java | 82 +++++++++++++++++++ 2 files changed, 111 insertions(+), 10 deletions(-) diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/UpgradePluginVersion.java b/rewrite-maven/src/main/java/org/openrewrite/maven/UpgradePluginVersion.java index b27c3a2183d..c46d0525077 100755 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/UpgradePluginVersion.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/UpgradePluginVersion.java @@ -19,9 +19,11 @@ import lombok.Value; import org.jspecify.annotations.Nullable; import org.openrewrite.*; +import org.openrewrite.internal.ListUtils; import org.openrewrite.maven.search.FindPlugin; import org.openrewrite.maven.table.MavenMetadataFailures; import org.openrewrite.maven.tree.MavenMetadata; +import org.openrewrite.maven.tree.Plugin; import org.openrewrite.maven.tree.ResolvedPom; import org.openrewrite.semver.Semver; import org.openrewrite.semver.VersionComparator; @@ -31,6 +33,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Objects; import java.util.Optional; import static java.util.Objects.requireNonNull; @@ -118,22 +121,26 @@ public Xml visitTag(Xml.Tag tag, ExecutionContext ctx) { Optional versionTag = tag.getChild("version"); Optional maybeVersionValue = versionTag.flatMap(Xml.Tag::getValue); if (maybeVersionValue.isPresent() || Boolean.TRUE.equals(addVersionIfMissing)) { - final String versionLookup; - if (maybeVersionValue.isPresent()) { - String versionValue = maybeVersionValue.get(); - versionLookup = versionValue.startsWith("${") ? - super.getResolutionResult().getPom().getValue(versionValue.trim()) : - versionValue; - } else { - versionLookup = "0.0.0"; - } - try { ResolvedPom resolvedPom = getResolutionResult().getPom(); String tagGroupId = resolvedPom.getValue(tag.getChildValue("groupId").orElse(groupId)); String tagArtifactId = resolvedPom.getValue(tag.getChildValue("artifactId").orElse(artifactId)); assert tagGroupId != null; assert tagArtifactId != null; + + final String versionLookup; + if (maybeVersionValue.isPresent()) { + String versionValue = maybeVersionValue.get(); + versionLookup = versionValue.startsWith("${") ? + resolvedPom.getValue(versionValue.trim()) : + versionValue; + } else { + if (hasManagedPluginVersion(resolvedPom, tagGroupId, tagArtifactId)) { + return tag; + } + versionLookup = "0.0.0"; + } + findNewerDependencyVersion(tagGroupId, tagArtifactId, versionLookup, ctx).ifPresent(newer -> doAfterVisit(new ChangePluginVersionVisitor(tagGroupId, tagArtifactId, newer, Boolean.TRUE.equals(addVersionIfMissing))) ); @@ -146,6 +153,18 @@ public Xml visitTag(Xml.Tag tag, ExecutionContext ctx) { return super.visitTag(tag, ctx); } + private boolean hasManagedPluginVersion(ResolvedPom resolvedPom, String groupId, String artifactId) { + for (Plugin p : ListUtils.concatAll(resolvedPom.getPluginManagement(), + resolvedPom.getRequested().getPluginManagement())) { + if (Objects.equals(p.getGroupId(), groupId) && + Objects.equals(p.getArtifactId(), artifactId) && + p.getVersion() != null) { + return true; + } + } + return false; + } + private Optional findNewerDependencyVersion(String groupId, String artifactId, String currentVersion, ExecutionContext ctx) throws MavenDownloadingException { MavenMetadata mavenMetadata = metadataFailures.insertRows(ctx, () -> downloadPluginMetadata(groupId, artifactId, ctx)); diff --git a/rewrite-maven/src/test/java/org/openrewrite/maven/UpgradePluginVersionTest.java b/rewrite-maven/src/test/java/org/openrewrite/maven/UpgradePluginVersionTest.java index c1f2f6395ce..0d036e58723 100644 --- a/rewrite-maven/src/test/java/org/openrewrite/maven/UpgradePluginVersionTest.java +++ b/rewrite-maven/src/test/java/org/openrewrite/maven/UpgradePluginVersionTest.java @@ -941,4 +941,86 @@ void defaultPluginGroupId() { ) ); } + + @Issue("https://github.com/openrewrite/rewrite-migrate-java/issues/992") + @Test + void shouldNotAddVersionWhenManagedByParent() { + rewriteRun( + spec -> spec.recipe(new UpgradePluginVersion( + "org.apache.maven.plugins", + "maven-compiler-plugin", + "3.11.0", + null, + null, + true + )), + pomXml( + """ + + org.openrewrite.example + my-app-parent + 1 + pom + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + + + + """, + """ + + org.openrewrite.example + my-app-parent + 1 + pom + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + + + + + """ + ), + mavenProject("child", + pomXml( + """ + + + org.openrewrite.example + my-app-parent + 1 + + my-app-child + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + """ + // No changes expected — version is managed by parent + ) + ) + ); + } } From 8f829b990bb12023782a101eed3b7ced7f14caed Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Fri, 27 Feb 2026 16:03:15 +0100 Subject: [PATCH 2/2] Use regular `.equals` as suggested --- .../main/java/org/openrewrite/maven/UpgradePluginVersion.java | 4 ++-- .../src/main/java/org/openrewrite/maven/tree/Plugin.java | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/UpgradePluginVersion.java b/rewrite-maven/src/main/java/org/openrewrite/maven/UpgradePluginVersion.java index c46d0525077..72856d9d32a 100755 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/UpgradePluginVersion.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/UpgradePluginVersion.java @@ -156,8 +156,8 @@ public Xml visitTag(Xml.Tag tag, ExecutionContext ctx) { private boolean hasManagedPluginVersion(ResolvedPom resolvedPom, String groupId, String artifactId) { for (Plugin p : ListUtils.concatAll(resolvedPom.getPluginManagement(), resolvedPom.getRequested().getPluginManagement())) { - if (Objects.equals(p.getGroupId(), groupId) && - Objects.equals(p.getArtifactId(), artifactId) && + if (p.getGroupId().equals(groupId) && + p.getArtifactId().equals(artifactId) && p.getVersion() != null) { return true; } diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/tree/Plugin.java b/rewrite-maven/src/main/java/org/openrewrite/maven/tree/Plugin.java index c0672c5dd81..8721b104f4a 100644 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/tree/Plugin.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/tree/Plugin.java @@ -55,7 +55,6 @@ public class Plugin { List dependencies; List executions; - @NonNull public String getGroupId() { return groupId == null ? PLUGIN_DEFAULT_GROUPID : groupId; }