diff --git a/samples/sample-all-deactivated/build.gradle.kts b/samples/sample-all-deactivated/build.gradle.kts index 49549ade..f79b10af 100644 --- a/samples/sample-all-deactivated/build.gradle.kts +++ b/samples/sample-all-deactivated/build.gradle.kts @@ -130,7 +130,6 @@ dependencies { implementation("org.apache.tomcat:tomcat-servlet-api:11.0.6") implementation("org.apache.tomcat:tomcat-websocket-api:11.0.6") implementation("org.apache.tomcat:tomcat-websocket-client-api:11.0.6") - implementation("org.apache.tomcat:tomcat-websocket:11.0.6") implementation("org.apache.velocity:velocity-engine-core:2.4.1") implementation("org.apache.velocity:velocity:1.7") implementation("org.bouncycastle:bc-fips-debug:2.1.0") @@ -201,7 +200,6 @@ dependencies { implementation("org.codehaus.woodstox:wstx-asl:4.0.6") implementation("org.codehaus.woodstox:wstx-lgpl:3.2.9") implementation("org.dom4j:dom4j:2.1.4") - implementation("org.eclipse.angus:angus-activation:2.0.2") implementation("org.eclipse.angus:jakarta.mail:2.0.3") implementation("org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api:5.0.2") implementation("org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api:2.0.0") diff --git a/samples/sample-all-deactivated/build.out b/samples/sample-all-deactivated/build.out index d5417aff..394bdaaa 100644 --- a/samples/sample-all-deactivated/build.out +++ b/samples/sample-all-deactivated/build.out @@ -75,7 +75,7 @@ compileClasspath - Compile classpath for source set 'main'. +--- javax.el:javax.el-api:3.0.0 FAILED +--- javax.inject:javax.inject:1 FAILED +--- javax.json:javax.json-api:1.1.4 FAILED -+--- javax.jws:javax.jws-api:1.1 FAILED ++--- javax.jws:javax.jws-api:1.1 +--- javax.mail:javax.mail-api:1.6.2 FAILED +--- javax.mail:mail:1.4.7 FAILED +--- javax.persistence:javax.persistence-api:2.2 FAILED @@ -98,7 +98,10 @@ compileClasspath - Compile classpath for source set 'main'. | \--- javax.activation:javax.activation-api:1.2.0 FAILED +--- javax.xml.soap:javax.xml.soap-api:1.4.0 +--- javax.xml.stream:stax-api:1.0-2 FAILED -+--- javax.xml.ws:jaxws-api:2.3.1 FAILED ++--- javax.xml.ws:jaxws-api:2.3.1 +| +--- javax.xml.bind:jaxb-api:2.3.1 (*) +| +--- javax.xml.soap:javax.xml.soap-api:1.4.0 +| \--- javax.annotation:javax.annotation-api:1.3.2 FAILED +--- jboss:javassist:3.8.0.GA FAILED +--- junit:junit-dep:4.11 FAILED +--- junit:junit:4.13.2 FAILED @@ -135,7 +138,6 @@ compileClasspath - Compile classpath for source set 'main'. +--- org.apache.tomcat:tomcat-servlet-api:11.0.6 FAILED +--- org.apache.tomcat:tomcat-websocket-api:11.0.6 FAILED +--- org.apache.tomcat:tomcat-websocket-client-api:11.0.6 FAILED -+--- org.apache.tomcat:tomcat-websocket:11.0.6 FAILED +--- org.apache.velocity:velocity-engine-core:2.4.1 FAILED +--- org.apache.velocity:velocity:1.7 FAILED +--- org.bouncycastle:bc-fips-debug:2.1.0 FAILED @@ -206,8 +208,6 @@ compileClasspath - Compile classpath for source set 'main'. +--- org.codehaus.woodstox:wstx-asl:4.0.6 FAILED +--- org.codehaus.woodstox:wstx-lgpl:3.2.9 FAILED +--- org.dom4j:dom4j:2.1.4 FAILED -+--- org.eclipse.angus:angus-activation:2.0.2 -| \--- jakarta.activation:jakarta.activation-api:2.1.3 FAILED +--- org.eclipse.angus:jakarta.mail:2.0.3 FAILED +--- org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api:5.0.2 FAILED +--- org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api:2.0.0 FAILED diff --git a/samples/sample-all/build.gradle.kts b/samples/sample-all/build.gradle.kts index cd80e467..6331cc3e 100644 --- a/samples/sample-all/build.gradle.kts +++ b/samples/sample-all/build.gradle.kts @@ -133,7 +133,6 @@ dependencies { implementation("org.apache.tomcat:tomcat-servlet-api:11.0.6") implementation("org.apache.tomcat:tomcat-websocket-api:11.0.6") implementation("org.apache.tomcat:tomcat-websocket-client-api:11.0.6") - implementation("org.apache.tomcat:tomcat-websocket:11.0.6") implementation("org.apache.velocity:velocity-engine-core:2.4.1") implementation("org.apache.velocity:velocity:1.7") implementation("org.bouncycastle:bc-fips-debug:2.1.0") @@ -204,7 +203,6 @@ dependencies { implementation("org.codehaus.woodstox:wstx-asl:4.0.6") implementation("org.codehaus.woodstox:wstx-lgpl:3.2.9") implementation("org.dom4j:dom4j:2.1.4") - implementation("org.eclipse.angus:angus-activation:2.0.2") implementation("org.eclipse.angus:jakarta.mail:2.0.3") implementation("org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api:5.0.2") implementation("org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api:2.0.0") diff --git a/samples/sample-all/build.out b/samples/sample-all/build.out index bb18de86..8a1f6d28 100644 --- a/samples/sample-all/build.out +++ b/samples/sample-all/build.out @@ -111,11 +111,7 @@ compileClasspath - Compile classpath for source set 'main'. +--- javax.el:javax.el-api:3.0.0 +--- javax.inject:javax.inject:1 -> com.jwebmp:javax.inject:1.1 +--- javax.json:javax.json-api:1.1.4 -+--- javax.jws:javax.jws-api:1.1 -> javax.xml.ws:jaxws-api:2.3.1 -| +--- javax.xml.bind:jaxb-api:2.3.1 -| | \--- javax.activation:javax.activation-api:1.2.0 -| +--- javax.xml.soap:javax.xml.soap-api:1.4.0 -| \--- javax.annotation:javax.annotation-api:1.3.2 ++--- javax.jws:javax.jws-api:1.1 +--- javax.mail:javax.mail-api:1.6.2 -> com.sun.mail:javax.mail:1.6.2 (*) +--- javax.mail:mail:1.4.7 -> com.sun.mail:javax.mail:1.6.2 (*) +--- javax.persistence:javax.persistence-api:2.2 @@ -134,10 +130,14 @@ compileClasspath - Compile classpath for source set 'main'. +--- javax.websocket:javax.websocket-client-api:1.1 -> org.eclipse.jetty.toolchain:jetty-javax-websocket-api:1.1.2 +--- javax.ws.rs:javax.ws.rs-api:2.1.1 -> org.jboss.resteasy:jaxrs-api:3.0.12.Final +--- javax.ws.rs:jsr311-api:1.1.1 -> org.jboss.resteasy:jaxrs-api:3.0.12.Final -+--- javax.xml.bind:jaxb-api:2.3.1 (*) ++--- javax.xml.bind:jaxb-api:2.3.1 +| \--- javax.activation:javax.activation-api:1.2.0 +--- javax.xml.soap:javax.xml.soap-api:1.4.0 +--- javax.xml.stream:stax-api:1.0-2 -> stax:stax-api:1.0.1 -+--- javax.xml.ws:jaxws-api:2.3.1 (*) ++--- javax.xml.ws:jaxws-api:2.3.1 +| +--- javax.xml.bind:jaxb-api:2.3.1 (*) +| +--- javax.xml.soap:javax.xml.soap-api:1.4.0 +| \--- javax.annotation:javax.annotation-api:1.3.2 +--- jboss:javassist:3.8.0.GA -> org.javassist:javassist:3.30.2-GA +--- junit:junit-dep:4.11 -> junit:junit:4.13.2 | \--- org.hamcrest:hamcrest-core:1.3 -> org.hamcrest:hamcrest:3.0 @@ -195,7 +195,6 @@ compileClasspath - Compile classpath for source set 'main'. +--- org.apache.tomcat:tomcat-servlet-api:11.0.6 -> jakarta.servlet:jakarta.servlet-api:6.1.0 +--- org.apache.tomcat:tomcat-websocket-api:11.0.6 -> jakarta.websocket:jakarta.websocket-api:2.2.0 +--- org.apache.tomcat:tomcat-websocket-client-api:11.0.6 -> jakarta.websocket:jakarta.websocket-client-api:2.2.0 -+--- org.apache.tomcat:tomcat-websocket:11.0.6 -> jakarta.websocket:jakarta.websocket-api:2.2.0 +--- org.apache.velocity:velocity-engine-core:2.4.1 | +--- org.apache.commons:commons-lang3:3.17.0 | \--- org.slf4j:slf4j-api:1.7.36 -> 2.0.17 (*) @@ -277,8 +276,6 @@ compileClasspath - Compile classpath for source set 'main'. +--- org.codehaus.woodstox:wstx-asl:4.0.6 -> org.codehaus.woodstox:woodstox-core-asl:4.4.1 (*) +--- org.codehaus.woodstox:wstx-lgpl:3.2.9 -> org.codehaus.woodstox:woodstox-core-asl:4.4.1 (*) +--- org.dom4j:dom4j:2.1.4 -+--- org.eclipse.angus:angus-activation:2.0.2 -| \--- jakarta.activation:jakarta.activation-api:2.1.3 +--- org.eclipse.angus:jakarta.mail:2.0.3 -> jakarta.mail:jakarta.mail-api:2.1.3 (*) +--- org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api:5.0.2 -> jakarta.servlet:jakarta.servlet-api:6.1.0 +--- org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api:2.0.0 -> jakarta.websocket:jakarta.websocket-api:2.2.0 diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/CapabilityDefinition.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/CapabilityDefinition.java index 2fe8433f..38fdb8bf 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/CapabilityDefinition.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/CapabilityDefinition.java @@ -19,9 +19,8 @@ import org.gradlex.jvm.dependency.conflict.detection.rules.aopalliance.AopallianceRule; import org.gradlex.jvm.dependency.conflict.detection.rules.guava.GuavaListenableFutureRule; import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JakartaActivationApiRule; -import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JakartaActivationImplementationRule; import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JakartaAnnotationApiRule; -import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JakartaJwsApisRule; +import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JakartaJwsApiRule; import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JakartaMailApiRule; import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JakartaServletApiRule; import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JakartaWebsocketApiRule; @@ -44,6 +43,8 @@ import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JavaxValidationApiRule; import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JavaxWebsocketApiRule; import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JavaxWsRsApiRule; +import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JavaxXmlBindApiRule; +import org.gradlex.jvm.dependency.conflict.detection.rules.jakarta.JavaxXmlWsApiRule; import org.gradlex.jvm.dependency.conflict.detection.rules.logging.LoggingModuleIdentifiers; import org.gradlex.jvm.dependency.conflict.resolution.DefaultResolutionStrategy; @@ -280,10 +281,6 @@ public enum CapabilityDefinition { "jakarta.activation:jakarta.activation-api", "com.sun.activation:jakarta.activation" ), - JAKARTA_ACTIVATION_IMPL(HIGHEST_VERSION, JakartaActivationImplementationRule.class, - "com.sun.activation:jakarta.activation", - "org.eclipse.angus:angus-activation" - ), JAKARTA_ANNOTATION_API(HIGHEST_VERSION, JakartaAnnotationApiRule.class, "jakarta.annotation:jakarta.annotation-api", "org.apache.tomcat:tomcat-annotations-api" @@ -307,14 +304,12 @@ public enum CapabilityDefinition { JAKARTA_WEBSOCKET_API(HIGHEST_VERSION, JakartaWebsocketApiRule.class, "jakarta.websocket:jakarta.websocket-api", "org.apache.tomcat:tomcat-websocket-api", - "org.apache.tomcat:tomcat-websocket", "org.apache.tomcat.embed:tomcat-embed-websocket", "org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api" ), JAKARTA_WEBSOCKET_CLIENT_API(HIGHEST_VERSION, JakartaWebsocketClientApiRule.class, "jakarta.websocket:jakarta.websocket-client-api", "org.apache.tomcat:tomcat-websocket-client-api", - "org.apache.tomcat:tomcat-websocket", "org.apache.tomcat.embed:tomcat-embed-websocket", "org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api" ), @@ -361,9 +356,7 @@ public enum CapabilityDefinition { ), JAVAX_JWS_API(HIGHEST_VERSION, JavaxJwsApisRule.class, "javax.jws:javax.jws-api", - "javax.xml.ws:jaxws-api", - "jakarta.jws:jakarta.jws-api", - "jakarta.xml.ws:jakarta.xml.ws-api" + "jakarta.jws:jakarta.jws-api" ), JAVAX_MAIL_API(HIGHEST_VERSION, JavaxMailApiRule.class, "com.sun.mail:mailapi", // API only @@ -446,7 +439,15 @@ public enum CapabilityDefinition { "jakarta.ws.rs:jakarta.ws.rs-api", "javax.ws.rs:javax.ws.rs-api" ), - JAKARTA_JWS_API(HIGHEST_VERSION, JakartaJwsApisRule.class, + JAVAX_XML_BIND_API(HIGHEST_VERSION, JavaxXmlBindApiRule.class, + "javax.xml.bind:jaxb-api", + "jakarta.xml.bind:jakarta.xml.bind-api" + ), + JAVAX_XML_WS_API(HIGHEST_VERSION, JavaxXmlWsApiRule.class, + "javax.xml.ws:jaxws-api", + "jakarta.xml.ws:jakarta.xml.ws-api" + ), + JAKARTA_JWS_API(HIGHEST_VERSION, JakartaJwsApiRule.class, "jakarta.jws:jakarta.jws-api", "jakarta.xml.ws:jakarta.xml.ws-api" ), diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaJwsApiRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaJwsApiRule.java new file mode 100644 index 00000000..5a83b0e8 --- /dev/null +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaJwsApiRule.java @@ -0,0 +1,44 @@ +/* + * Copyright the GradleX team. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradlex.jvm.dependency.conflict.detection.rules.jakarta; + +import org.gradle.api.artifacts.CacheableRule; +import org.gradle.api.artifacts.ModuleVersionIdentifier; +import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition; +import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinitionRule; +import org.gradlex.jvm.dependency.conflict.detection.util.VersionNumber; + +import javax.inject.Inject; + +@CacheableRule +public abstract class JakartaJwsApiRule extends CapabilityDefinitionRule { + + private static final String JWS_MERGER_VERSION = "4.0.0"; + + @Inject + public JakartaJwsApiRule(CapabilityDefinition rule) { + super(rule); + } + + @Override + protected boolean shouldApply(ModuleVersionIdentifier id) { + if (id.getName().equals("jakarta.xml.ws:jakarta.xml.ws-api")) { + return VersionNumber.parse(getVersion(id)).compareTo(VersionNumber.parse(JWS_MERGER_VERSION)) >= 0; + } + return true; + } +} diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaJwsApisRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxXmlBindApiRule.java similarity index 79% rename from src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaJwsApisRule.java rename to src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxXmlBindApiRule.java index ad1ef953..598d269b 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JakartaJwsApisRule.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/detection/rules/jakarta/JavaxXmlBindApiRule.java @@ -25,15 +25,17 @@ import javax.inject.Inject; @CacheableRule -public abstract class JakartaJwsApisRule extends CapabilityDefinitionRule { +public abstract class JavaxXmlBindApiRule extends CapabilityDefinitionRule { + + static final String FIRST_JAKARTA_VERSION = "3.0.0"; @Inject - public JakartaJwsApisRule(CapabilityDefinition rule) { + public JavaxXmlBindApiRule(CapabilityDefinition rule) { super(rule); } @Override protected boolean shouldApply(ModuleVersionIdentifier id) { - return VersionNumber.parse(getVersion(id)).compareTo(VersionNumber.parse(JavaxJwsApisRule.FIRST_JAKARTA_VERSION)) >= 0; + return VersionNumber.parse(id.getVersion()).compareTo(VersionNumber.parse(FIRST_JAKARTA_VERSION)) < 0; } } diff --git a/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/JarOverlapTest.groovy b/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/JarOverlapTest.groovy index 31d77253..54456358 100644 --- a/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/JarOverlapTest.groovy +++ b/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/JarOverlapTest.groovy @@ -15,12 +15,14 @@ class JarOverlapTest extends Specification { // Some Jars do not have overlapping classes, but contain conflicting implementations of the same service. static def expectedToOverlap = values() - [ + HAMCREST_CORE, // contains 'IsDeprecated.class' and forwards to HAMCREST + HAMCREST_LIBRARY, // contains 'IsDeprecated.class' and forwards to HAMCREST + LOG4J2_IMPL, + SLF4J_IMPL, // register conflicting service implementations SLF4J_VS_JCL, // bridge vs. replacement + SLF4J_VS_JUL, SLF4J_VS_LOG4J2_FOR_JCL, // SLF4J replaces JCL, while LOG4J depends on JCL - SLF4J_IMPL, // register conflicting service implementations - SLF4J_VS_LOG4J2_FOR_JUL, // register conflicting handler implementations - HAMCREST_CORE, // contains 'IsDeprecated.class' and forwards to HAMCREST - HAMCREST_LIBRARY // contains 'IsDeprecated.class' and forwards to HAMCREST + SLF4J_VS_LOG4J2_FOR_JUL // register conflicting handler implementations ] def latestVersions = [] @@ -65,7 +67,7 @@ class JarOverlapTest extends Specification { List>> jarClassFiles = conf.files.collect { jar -> def jarName = jar.name new Tuple2(jarName, new ZipFile(jar).withCloseable { - it.entries().collect { entry -> entry.name }.findAll { it.endsWith(".class") } as Set + it.entries().collect { entry -> entry.name }.findAll { it.endsWith(".class") && !it.endsWith("module-info.class") } as Set }) } @@ -92,7 +94,9 @@ class JarOverlapTest extends Specification { case JAVAX_INJECT_API: return ["jakarta.inject:jakarta.inject-api:1.0.5"] case JAVAX_JSON_API: - return ["jakarta.json:jakarta.json-api:1.1.6"] + return ["jakarta.json:jakarta.json-api:1.1.6", "org.glassfish:jakarta.json:1.1.6"] + case JAVAX_JWS_API: + return ["jakarta.jws:jakarta.jws-api:1.1.1"] case JAVAX_MAIL_API: return ["com.sun.mail:mailapi:1.6.7", "jakarta.mail:jakarta.mail-api:1.6.7", "com.sun.mail:jakarta.mail:1.6.7"] case JAVAX_PERSISTENCE_API: @@ -104,6 +108,8 @@ class JarOverlapTest extends Specification { return ["jakarta.servlet.jsp:jakarta.servlet.jsp-api:2.3.6"] case JAVAX_SERVLET_JSTL: return ["jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api:1.2.7"] + case JAVAX_SOAP_API: + return ["jakarta.xml.soap:jakarta.xml.soap-api:1.4.2"] case JAVAX_TRANSACTION_API: return ["jakarta.transaction:jakarta.transaction-api:1.3.3"] case JAVAX_VALIDATION_API: @@ -114,6 +120,10 @@ class JarOverlapTest extends Specification { "org.apache.tomcat.embed:tomcat-embed-websocket:9.0.104"] case JAVAX_WS_RS_API: return ["jakarta.ws.rs:jakarta.ws.rs-api:2.1.6"] + case JAVAX_XML_BIND_API: + return ["jakarta.xml.bind:jakarta.xml.bind-api:2.3.3"] + case JAVAX_XML_WS_API: + return ["jakarta.xml.ws:jakarta.xml.ws-api:2.3.3"] default: return [] }