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