diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/AddDependency.java b/rewrite-maven/src/main/java/org/openrewrite/maven/AddDependency.java index da61d6ec3a6..4933e8e7291 100644 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/AddDependency.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/AddDependency.java @@ -229,10 +229,16 @@ public Xml visitDocument(Xml.Document document, ExecutionContext ctx) { for (ResolvedDependency d : dependencies.get(Scope.Compile)) { if (hasAcceptableTransitivity(d, acc) && groupId.equals(d.getGroupId()) && - artifactId.equals(d.getArtifactId()) && - (d.isTransitive() || - (d.isDirect() && version.equals(d.getVersion()))) - ) { + artifactId.equals(d.getArtifactId())) { + if (d.isTransitive() || (d.isDirect() && version.equals(d.getVersion()))) { + return maven; + } + if (d.isDirect() && (scope == null || Scope.fromName(scope) == Scope.Compile)) { + // Direct compile-scope dependency at a different version — update keeping compile scope + return new AddDependencyVisitor( + groupId, artifactId, version, versionPattern, null, releasesOnly, + type, classifier, optional, familyPatternCompiled, metadataFailures).visitNonNull(document, ctx); + } return maven; } } @@ -243,7 +249,9 @@ public Xml visitDocument(Xml.Document document, ExecutionContext ctx) { if ((resolvedScopeEnum == Scope.Provided || resolvedScopeEnum == Scope.Test) && dependencies.get(resolvedScopeEnum) != null) { for (ResolvedDependency d : dependencies.get(resolvedScopeEnum)) { if (hasAcceptableTransitivity(d, acc) && - groupId.equals(d.getGroupId()) && artifactId.equals(d.getArtifactId())) { + groupId.equals(d.getGroupId()) && artifactId.equals(d.getArtifactId()) && + (d.isTransitive() || + (d.isDirect() && version.equals(d.getVersion())))) { return maven; } } diff --git a/rewrite-maven/src/test/java/org/openrewrite/maven/AddDependencyTest.java b/rewrite-maven/src/test/java/org/openrewrite/maven/AddDependencyTest.java index a84f331a036..7b521c1d883 100644 --- a/rewrite-maven/src/test/java/org/openrewrite/maven/AddDependencyTest.java +++ b/rewrite-maven/src/test/java/org/openrewrite/maven/AddDependencyTest.java @@ -2261,6 +2261,90 @@ void addDependencyUpgradesScopeOnlyWhenExistingDependencyHasNarrowerScopeAndEqua ); } + @Test + void existingDependencyUpdatedWithMainSources() { + rewriteRun( + spec -> spec.recipe(addDependency("com.google.guava:guava:30.0-jre", null)), + mavenProject("project", + srcMainJava( + java("public class A {}") + ), + pomXml( + """ + + com.mycompany.app + my-app + 1 + + + com.google.guava + guava + 29.0-jre + + + + """, + """ + + com.mycompany.app + my-app + 1 + + + com.google.guava + guava + 30.0-jre + + + + """ + ) + ) + ); + } + + @Test + void existingDependencyUpdatedWithTestSourcesOnly() { + rewriteRun( + spec -> spec.recipe(addDependency("com.google.guava:guava:30.0-jre", null)), + mavenProject("project", + srcTestJava( + java("public class A {}") + ), + pomXml( + """ + + com.mycompany.app + my-app + 1 + + + com.google.guava + guava + 29.0-jre + + + + """, + """ + + com.mycompany.app + my-app + 1 + + + com.google.guava + guava + 30.0-jre + + + + """ + ) + ) + ); + } + private AddDependency addDependency(@SuppressWarnings("SameParameterValue") String gav) { return addDependency(gav, null, null, null); }