From a15a6075a13c6fadc2dc0ba3a4de6eb5e19e55a9 Mon Sep 17 00:00:00 2001 From: Evie Lau <689163+evie-lau@users.noreply.github.com> Date: Fri, 26 Jun 2026 08:26:52 -0500 Subject: [PATCH 1/4] Add failing test case where jakarta.xml.ws-api is duplicated --- ...ReplaceJakartaJwsWithJakartaXmlWsTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/ReplaceJakartaJwsWithJakartaXmlWsTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/ReplaceJakartaJwsWithJakartaXmlWsTest.java index 95da9d1257..5a82c776b1 100644 --- a/src/test/java/org/openrewrite/java/migrate/jakarta/ReplaceJakartaJwsWithJakartaXmlWsTest.java +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/ReplaceJakartaJwsWithJakartaXmlWsTest.java @@ -61,6 +61,42 @@ void replacesJakartaJwsApiInPlaceWithJakartaXmlWsApi() { ); } + @Test + void avoidDuplicateWsApi() { + rewriteRun( + //language=xml + pomXml( + """ + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + + + jakarta.jws + jakarta.jws-api + 3.0.0 + + + jakarta.xml.ws + jakarta.xml.ws-api + 3.0.1 + + + + """, + spec -> spec.after(pom -> assertThat(pom) + .doesNotContain("jakarta.jws") + // Verify only one entry of `jakarta.xml.ws-api` exists + .containsOnlyOnce("jakarta.xml.ws-api") + // Verify the dependency was upgraded to a 4.x version, without pinning the exact patch + .contains("4") + .actual()) + ) + ); + } + @Test void noChangeWhenJakartaJwsApiNotPresent() { rewriteRun( From 74c825ee290d42d142b3e6c1c8c3de4502efcbd2 Mon Sep 17 00:00:00 2001 From: Evie Lau <689163+evie-lau@users.noreply.github.com> Date: Fri, 26 Jun 2026 08:47:40 -0500 Subject: [PATCH 2/4] Remove duplicate deps after jws-api to xml.ws-api change --- src/main/resources/META-INF/rewrite/jakarta-ee-10.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/resources/META-INF/rewrite/jakarta-ee-10.yml b/src/main/resources/META-INF/rewrite/jakarta-ee-10.yml index fc4a254cb3..b37b554e5a 100644 --- a/src/main/resources/META-INF/rewrite/jakarta-ee-10.yml +++ b/src/main/resources/META-INF/rewrite/jakarta-ee-10.yml @@ -509,6 +509,8 @@ recipeList: version: 4.0.x onlyIfUsing: jakarta.jws..* acceptTransitive: true + - org.openrewrite.maven.RemoveDuplicateDependencies + --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.migrate.jakarta.UpdateJerseyDependencies From f73c98b6418abac13a419a308d6f8b04b4d9478c Mon Sep 17 00:00:00 2001 From: Evie Lau <689163+evie-lau@users.noreply.github.com> Date: Fri, 26 Jun 2026 09:11:43 -0500 Subject: [PATCH 3/4] Add test case for jws-api transitive --- build.gradle.kts | 2 + ...ReplaceJakartaJwsWithJakartaXmlWsTest.java | 44 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index fb0e89dd79..a767ea7cbb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,6 +25,7 @@ recipeDependencies { testParserClasspath("jakarta.faces:jakarta.faces-api:4.0.1") testParserClasspath("jakarta.servlet:jakarta.servlet-api:4.0.2") testParserClasspath("jakarta.servlet:jakarta.servlet-api:5.0.0") + testParserClasspath("jakarta.jws:jakarta.jws-api:3.0.0") testParserClasspath("jakarta.ws.rs:jakarta.ws.rs-api:3.1.0") testParserClasspath("jakarta.xml.soap:jakarta.xml.soap-api:2.0.1") testParserClasspath("javax.enterprise:cdi-api:2.0.SP1") @@ -93,6 +94,7 @@ dependencies { testRuntimeOnly("com.fasterxml.jackson.module:jackson-module-jaxb-annotations") testRuntimeOnly("commons-logging:commons-logging:1.3.2") testRuntimeOnly("org.apache.logging.log4j:log4j-api:2.23.1") + testRuntimeOnly("jakarta.jws:jakarta.jws-api:3.0.0") testRuntimeOnly("org.apache.johnzon:johnzon-core:1.2.18") testRuntimeOnly("org.apache.groovy:groovy:4.+") testRuntimeOnly("org.jboss.logging:jboss-logging:3.6.0.Final") diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/ReplaceJakartaJwsWithJakartaXmlWsTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/ReplaceJakartaJwsWithJakartaXmlWsTest.java index 5a82c776b1..034ddffadd 100644 --- a/src/test/java/org/openrewrite/java/migrate/jakarta/ReplaceJakartaJwsWithJakartaXmlWsTest.java +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/ReplaceJakartaJwsWithJakartaXmlWsTest.java @@ -17,10 +17,14 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; +import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; import static org.assertj.core.api.Assertions.assertThat; +import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.java.Assertions.mavenProject; +import static org.openrewrite.java.Assertions.srcMainJava; import static org.openrewrite.maven.Assertions.pomXml; class ReplaceJakartaJwsWithJakartaXmlWsTest implements RewriteTest { @@ -97,6 +101,46 @@ void avoidDuplicateWsApi() { ); } + @Test + void addsJakartaXmlWsApiWhenJwsIsOnlyTransitive() { + rewriteRun( + spec -> spec.parser(JavaParser.fromJavaVersion().classpath("jakarta.jws-api")), + mavenProject( + "demo", + //language=java + srcMainJava( + java( + """ + import jakarta.jws.WebService; + + @WebService + public class HelloService { + public String sayHello(String name) { + return "Hello, " + name; + } + } + """ + ) + ), + //language=xml + pomXml( + """ + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + + """, + spec -> spec.after(pom -> assertThat(pom) + .containsOnlyOnce("jakarta.xml.ws-api") + .contains("4") + .actual()) + ) + ) + ); + } + @Test void noChangeWhenJakartaJwsApiNotPresent() { rewriteRun( From 7898c3d7f3eac0554733dbb0a888d26f18bded08 Mon Sep 17 00:00:00 2001 From: Evie Lau <689163+evie-lau@users.noreply.github.com> Date: Fri, 26 Jun 2026 12:36:39 -0500 Subject: [PATCH 4/4] Remove recipe change, rely on upstream fix --- src/main/resources/META-INF/rewrite/jakarta-ee-10.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/META-INF/rewrite/jakarta-ee-10.yml b/src/main/resources/META-INF/rewrite/jakarta-ee-10.yml index b37b554e5a..2bec00b2b6 100644 --- a/src/main/resources/META-INF/rewrite/jakarta-ee-10.yml +++ b/src/main/resources/META-INF/rewrite/jakarta-ee-10.yml @@ -509,7 +509,6 @@ recipeList: version: 4.0.x onlyIfUsing: jakarta.jws..* acceptTransitive: true - - org.openrewrite.maven.RemoveDuplicateDependencies --- type: specs.openrewrite.org/v1beta/recipe