diff --git a/bom/application/pom.xml b/bom/application/pom.xml index 1e3c506902bf1..4035de8d85793 100644 --- a/bom/application/pom.xml +++ b/bom/application/pom.xml @@ -4407,6 +4407,10 @@ javax.activation activation + + org.jboss + jandex + diff --git a/build-parent/pom.xml b/build-parent/pom.xml index 691fbcc8b8fdf..41b87cb2a71f3 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -1279,6 +1279,7 @@ io.quarkus.build-parent + io.quarkus.jakarta-json-cleanup diff --git a/extensions/infinispan-client/runtime/pom.xml b/extensions/infinispan-client/runtime/pom.xml index d0395f6447303..ce7a828f9cc7e 100644 --- a/extensions/infinispan-client/runtime/pom.xml +++ b/extensions/infinispan-client/runtime/pom.xml @@ -163,7 +163,6 @@ io.quarkus.infinispan - io.quarkus.fix-infinispan-commons diff --git a/extensions/jdbc/jdbc-db2/deployment/pom.xml b/extensions/jdbc/jdbc-db2/deployment/pom.xml index a412fa6bb6395..a803ad71c492f 100644 --- a/extensions/jdbc/jdbc-db2/deployment/pom.xml +++ b/extensions/jdbc/jdbc-db2/deployment/pom.xml @@ -48,6 +48,11 @@ assertj-core test + + org.eclipse.transformer + org.eclipse.transformer + 0.5.0 + diff --git a/extensions/jdbc/jdbc-db2/deployment/src/main/java/io/quarkus/jdbc/db2/deployment/JakartaEnablement.java b/extensions/jdbc/jdbc-db2/deployment/src/main/java/io/quarkus/jdbc/db2/deployment/JakartaEnablement.java new file mode 100644 index 0000000000000..777fa15c04650 --- /dev/null +++ b/extensions/jdbc/jdbc-db2/deployment/src/main/java/io/quarkus/jdbc/db2/deployment/JakartaEnablement.java @@ -0,0 +1,88 @@ +package io.quarkus.jdbc.db2.deployment; + +import java.nio.ByteBuffer; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.eclipse.transformer.action.ActionContext; +import org.eclipse.transformer.action.ByteData; +import org.eclipse.transformer.action.impl.ActionContextImpl; +import org.eclipse.transformer.action.impl.ByteDataImpl; +import org.eclipse.transformer.action.impl.ClassActionImpl; +import org.eclipse.transformer.action.impl.SelectionRuleImpl; +import org.eclipse.transformer.action.impl.SignatureRuleImpl; +import org.eclipse.transformer.util.FileUtils; +import org.objectweb.asm.ClassReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.quarkus.bootstrap.classloading.QuarkusClassLoader; +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.builditem.BytecodeTransformerBuildItem; + +/** + * The DB2 driver is compiled using references to classes in the javax.transaction + * package; we need to transform these to fix compatibility with jakarta.transaction. + * We do this by leveraging the Eclipse Transformer project during Augmentation, so + * that end users don't need to bother. + */ +public class JakartaEnablement { + + private static final List CLASSES_NEEDING_TRANSFORMATION = List.of( + "com.ibm.db2.jcc.t2zos.ab", + "com.ibm.db2.jcc.t2zos.T2zosConnection", + "com.ibm.db2.jcc.t2zos.T2zosConfiguration"); + + @BuildStep + void transformToJakarta(BuildProducer transformers) { + if (QuarkusClassLoader.isClassPresentAtRuntime("jakarta.transaction.Transaction")) { + JakartaTransformer tr = new JakartaTransformer(); + for (String classname : CLASSES_NEEDING_TRANSFORMATION) { + final BytecodeTransformerBuildItem item = new BytecodeTransformerBuildItem.Builder() + .setCacheable(true) + .setContinueOnFailure(false) + .setClassToTransform(classname) + .setClassReaderOptions(ClassReader.SKIP_DEBUG) + .setInputTransformer(tr::transform) + .build(); + transformers.produce(item); + } + } + } + + private static class JakartaTransformer { + + private final Logger logger; + private final ActionContext ctx; + private static final Map renames = Collections.singletonMap(forbiddenName(), "jakarta.transaction"); + + JakartaTransformer() { + logger = LoggerFactory.getLogger("JakartaTransformer"); + //N.B. we enable only this single transformation of package renames, not the full set of capabilities of Eclipse Transformer; + //this might need tailoring if the same idea gets applied to a different context. + ctx = new ActionContextImpl(logger, + new SelectionRuleImpl(logger, Collections.emptyMap(), Collections.emptyMap()), + new SignatureRuleImpl(logger, renames, null, null, null, null, null, Collections.emptyMap())); + } + + //Need to prevent the Eclipse Transformer - which is run on this whole code base - to actually replace this name: + private static String forbiddenName() { + StringBuilder sb = new StringBuilder("java") + .append("x.") + .append("transaction"); + return sb.toString(); + } + + byte[] transform(final String name, final byte[] bytes) { + logger.info("Jakarta EE compatibility enhancer for Quarkus: transforming " + name); + final ClassActionImpl classTransformer = new ClassActionImpl(ctx); + final ByteBuffer input = ByteBuffer.wrap(bytes); + final ByteData inputData = new ByteDataImpl(name, input, FileUtils.DEFAULT_CHARSET); + final ByteData outputData = classTransformer.apply(inputData); + return outputData.buffer().array(); + } + } + +} diff --git a/extensions/smallrye-reactive-messaging-amqp/deployment/pom.xml b/extensions/smallrye-reactive-messaging-amqp/deployment/pom.xml index 60bd5b514e3af..ecd53ab12ed09 100644 --- a/extensions/smallrye-reactive-messaging-amqp/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging-amqp/deployment/pom.xml @@ -47,20 +47,6 @@ org.apache.activemq artemis-server test - - - org.jboss.logmanager - jboss-logmanager - - - commons-logging - commons-logging - - - jakarta.json - jakarta.json-api - - org.testcontainers @@ -123,5 +109,4 @@ - diff --git a/independent-projects/resteasy-reactive/server/jsonb/pom.xml b/independent-projects/resteasy-reactive/server/jsonb/pom.xml index 5213908b714b5..61859d2038764 100644 --- a/independent-projects/resteasy-reactive/server/jsonb/pom.xml +++ b/independent-projects/resteasy-reactive/server/jsonb/pom.xml @@ -111,6 +111,7 @@ io.quarkus.jakarta-jaxb-switch + io.quarkus.jakarta-json-cleanup diff --git a/integration-tests/gradle/src/main/resources/annotation-processor-multi-module/application/src/main/java/org/acme/quarkus/sample/HelloResource.java b/integration-tests/gradle/src/main/resources/annotation-processor-multi-module/application/src/main/java/org/acme/quarkus/sample/HelloResource.java index 0b3bf8d8c5a20..742b10f2bbc60 100644 --- a/integration-tests/gradle/src/main/resources/annotation-processor-multi-module/application/src/main/java/org/acme/quarkus/sample/HelloResource.java +++ b/integration-tests/gradle/src/main/resources/annotation-processor-multi-module/application/src/main/java/org/acme/quarkus/sample/HelloResource.java @@ -12,16 +12,10 @@ @Path("/hello") public class HelloResource { - private final CarMapper carMapper; - - public HelloResource(CarMapper carMapper) { - this.carMapper = carMapper; - } - @GET @Produces(MediaType.APPLICATION_JSON) public CarDTO hello() { Car car = new Car("foo", 4); - return carMapper.carToCarDTO(car); + return CarMapper.INSTANCE.carToCarDTO(car); } } \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/annotation-processor-multi-module/common/src/main/java/org/acme/common/CarMapper.java b/integration-tests/gradle/src/main/resources/annotation-processor-multi-module/common/src/main/java/org/acme/common/CarMapper.java index 709387b4df8a7..fb08e64b96df3 100644 --- a/integration-tests/gradle/src/main/resources/annotation-processor-multi-module/common/src/main/java/org/acme/common/CarMapper.java +++ b/integration-tests/gradle/src/main/resources/annotation-processor-multi-module/common/src/main/java/org/acme/common/CarMapper.java @@ -2,13 +2,15 @@ import org.acme.common.domain.Car; import org.acme.common.domain.CarDTO; -import org.mapstruct.InjectionStrategy; import org.mapstruct.Mapper; import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; -@Mapper(componentModel = "cdi", injectionStrategy = InjectionStrategy.CONSTRUCTOR) +@Mapper public interface CarMapper { + CarMapper INSTANCE = Mappers.getMapper( CarMapper.class ); + @Mapping(source = "numberOfSeats", target = "seatNumber") CarDTO carToCarDTO(Car car); diff --git a/integration-tests/gradle/src/main/resources/annotation-processor-simple-module/src/main/java/org/acme/quarkus/CarMapper.java b/integration-tests/gradle/src/main/resources/annotation-processor-simple-module/src/main/java/org/acme/quarkus/CarMapper.java index 1f24e89035019..927e199fb0c74 100644 --- a/integration-tests/gradle/src/main/resources/annotation-processor-simple-module/src/main/java/org/acme/quarkus/CarMapper.java +++ b/integration-tests/gradle/src/main/resources/annotation-processor-simple-module/src/main/java/org/acme/quarkus/CarMapper.java @@ -5,10 +5,13 @@ import org.mapstruct.InjectionStrategy; import org.mapstruct.Mapper; import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; -@Mapper(componentModel = "cdi", injectionStrategy = InjectionStrategy.CONSTRUCTOR) +@Mapper public interface CarMapper { + CarMapper INSTANCE = Mappers.getMapper( CarMapper.class ); + @Mapping(source = "numberOfSeats", target = "seatNumber") CarDTO carToCarDTO(Car car); diff --git a/integration-tests/gradle/src/main/resources/annotation-processor-simple-module/src/main/java/org/acme/quarkus/sample/HelloResource.java b/integration-tests/gradle/src/main/resources/annotation-processor-simple-module/src/main/java/org/acme/quarkus/sample/HelloResource.java index bd74f8b8bdbdc..42d1a37e426f4 100644 --- a/integration-tests/gradle/src/main/resources/annotation-processor-simple-module/src/main/java/org/acme/quarkus/sample/HelloResource.java +++ b/integration-tests/gradle/src/main/resources/annotation-processor-simple-module/src/main/java/org/acme/quarkus/sample/HelloResource.java @@ -12,16 +12,10 @@ @Path("/hello") public class HelloResource { - private final CarMapper carMapper; - - public HelloResource(CarMapper carMapper) { - this.carMapper = carMapper; - } - @GET @Produces(MediaType.APPLICATION_JSON) public CarDTO hello() { Car car = new Car("foo", 4); - return carMapper.carToCarDTO(car); + return CarMapper.INSTANCE.carToCarDTO(car); } } \ No newline at end of file diff --git a/integration-tests/reactive-messaging-amqp/pom.xml b/integration-tests/reactive-messaging-amqp/pom.xml index da8bdcb487de4..2ccd4e67e7cf8 100644 --- a/integration-tests/reactive-messaging-amqp/pom.xml +++ b/integration-tests/reactive-messaging-amqp/pom.xml @@ -59,24 +59,6 @@ org.apache.activemq artemis-server test - - - org.jboss.logmanager - jboss-logmanager - - - commons-logging - commons-logging - - - org.apache.johnzon - johnzon-core - - - jakarta.json - jakarta.json-api - - org.apache.activemq diff --git a/jakarta/rewrite.yml b/jakarta/rewrite.yml index 2a91603ad2fcf..1a9c3091d19c0 100644 --- a/jakarta/rewrite.yml +++ b/jakarta/rewrite.yml @@ -183,7 +183,7 @@ recipeList: # WildFly Security - org.openrewrite.maven.ChangePropertyValue: key: wildfly-elytron.version - newValue: 2.0.0.Beta3 + newValue: 2.0.0.Final --- type: specs.openrewrite.org/v1beta/recipe name: io.quarkus.jakarta-jaxrs-jaxb @@ -316,6 +316,31 @@ recipeList: artifactId: resteasy-json-p-provider exclusionGroupId: jakarta.json exclusionArtifactId: jakarta.json-api + - org.openrewrite.maven.RemoveExclusion: + groupId: org.apache.activemq + artifactId: artemis-server + exclusionGroupId: jakarta.json + exclusionArtifactId: jakarta.json-api + - org.openrewrite.maven.RemoveExclusion: + groupId: org.apache.activemq + artifactId: artemis-amqp-protocol + exclusionGroupId: jakarta.json + exclusionArtifactId: jakarta.json-api + - org.openrewrite.maven.RemoveExclusion: + groupId: org.eclipse + artifactId: yasson + exclusionGroupId: jakarta.json + exclusionArtifactId: jakarta.json-api + - org.openrewrite.maven.RemoveExclusion: + groupId: org.eclipse + artifactId: yasson + exclusionGroupId: org.glassfish + exclusionArtifactId: jakarta.json + - org.openrewrite.maven.RemoveExclusion: + groupId: jakarta.json.bind + artifactId: jakarta.json.bind-api + exclusionGroupId: jakarta.json + exclusionArtifactId: jakarta.json-api --- type: specs.openrewrite.org/v1beta/recipe name: io.quarkus.jakarta-json @@ -652,7 +677,7 @@ recipeList: newValue: 3.0 - org.openrewrite.maven.ChangePropertyValue: key: resteasy-reactive-testsuite.repo.ref - newValue: c5785f3465fa87395574fde1274c1712b3aa728b + newValue: 4116f1a0c5605ad00d7779367dac8002af8c6882 --- type: specs.openrewrite.org/v1beta/recipe name: io.quarkus.maven.javax.managed @@ -826,10 +851,10 @@ displayName: Adjust Infinispan version and dependencies recipeList: - org.openrewrite.maven.ChangePropertyValue: key: infinispan.version - newValue: 14.0.0.Dev04 + newValue: 14.0.0.Final - org.openrewrite.maven.ChangePropertyValue: key: infinispan.protostream.version - newValue: 14.0.0.CR2 + newValue: 4.5.0.Final - org.openrewrite.maven.ChangeManagedDependencyGroupIdAndArtifactId: oldGroupId: org.infinispan oldArtifactId: infinispan-core @@ -840,41 +865,24 @@ recipeList: oldGroupId: org.infinispan oldArtifactId: infinispan-client-hotrod newGroupId: org.infinispan - newArtifactId: infinispan-client-hotrod - newClassifier: jakarta + newArtifactId: infinispan-client-hotrod-jakarta - org.openrewrite.maven.ChangeManagedDependencyGroupIdAndArtifactId: oldGroupId: org.infinispan oldArtifactId: infinispan-commons newGroupId: org.infinispan - newArtifactId: infinispan-commons - newClassifier: jakarta + newArtifactId: infinispan-commons-jakarta - org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId: oldGroupId: org.infinispan oldArtifactId: infinispan-core newGroupId: org.infinispan - newArtifactId: infinispan-core - newClassifier: jakarta + newArtifactId: infinispan-core-jakarta - org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId: oldGroupId: org.infinispan oldArtifactId: infinispan-client-hotrod newGroupId: org.infinispan - newArtifactId: infinispan-client-hotrod - newClassifier: jakarta + newArtifactId: infinispan-client-hotrod-jakarta - org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId: oldGroupId: org.infinispan oldArtifactId: infinispan-commons newGroupId: org.infinispan - newArtifactId: infinispan-commons - newClassifier: jakarta ---- -type: specs.openrewrite.org/v1beta/recipe -name: io.quarkus.fix-infinispan-commons -displayName: Adjust Infinispan version and dependencies -recipeList: - - org.openrewrite.maven.ExcludeDependency: - groupId: org.infinispan - artifactId: infinispan-commons - - org.openrewrite.maven.AddDependencyNoQuestionsAsked: - groupId: org.infinispan - artifactId: infinispan-commons - classifier: jakarta + newArtifactId: infinispan-commons-jakarta diff --git a/jakarta/transform.sh b/jakarta/transform.sh index 05f74fbc12118..1f9096061d3c6 100755 --- a/jakarta/transform.sh +++ b/jakarta/transform.sh @@ -230,8 +230,9 @@ sed -i 's@com.sun.xml.bind.v2.ContextFactory@org.glassfish.jaxb.runtime.v2.Conte sed -i '/com.sun.xml.internal.bind.v2.ContextFactory/d' extensions/jaxb/deployment/src/main/java/io/quarkus/jaxb/deployment/JaxbProcessor.java ## JSON-P implementation switch -sed -i 's@org.glassfish:jakarta.json@org.eclipse.parsson:jakarta.json@g' extensions/logging-json/runtime/pom.xml -sed -i 's@org.glassfish:jakarta.json@org.eclipse.parsson:jakarta.json@g' extensions/jsonp/runtime/pom.xml +sed -i 's@org.glassfish:jakarta.json@org.eclipse.parsson:parsson\n jakarta.json:jakarta.json-api@g' extensions/logging-json/runtime/pom.xml +sed -i 's@org.glassfish:jakarta.json@org.eclipse.parsson:parsson@g' extensions/jsonp/runtime/pom.xml +sed -i 's@org.glassfish:javax.json@org.glassfish:javax.json\n org.glassfish:jakarta.json\n org.eclipse.parsson:jakarta.json@g' extensions/jsonp/runtime/pom.xml sed -i 's@import org.glassfish.json.JsonProviderImpl;@import org.eclipse.parsson.JsonProviderImpl;@g' extensions/jsonp/deployment/src/main/java/io/quarkus/jsonp/deployment/JsonpProcessor.java ## cleanup phase - needs to be done once everything has been rewritten @@ -299,6 +300,9 @@ sed -i 's@org.jboss.narayana.rts:narayana-lra@org.jboss.narayana.rts:narayana-lr sed -i 's@org.jboss.narayana.rts:lra-client@org.jboss.narayana.rts:lra-client-jakarta@g' extensions/narayana-lra/runtime/pom.xml sed -i 's@META-INF/services/javax.ws.rs.client.ClientBuilder@META-INF/services/jakarta.ws.rs.client.ClientBuilder@g' extensions/narayana-lra/runtime/pom.xml +find integration-tests/gradle -name build.gradle | xargs sed -i 's/javax.enterprise.context.ApplicationScoped/jakarta.enterprise.context.ApplicationScoped/g' +find integration-tests/gradle -name build.gradle | xargs sed -i 's/javax.ws.rs.Path/jakarta.ws.rs.Path/g' + transform_documentation sed -i 's@javax/ws/rs@jakarta/ws/rs@g' docs/src/main/asciidoc/resteasy-reactive.adoc sed -i 's@https://javadoc.io/doc/jakarta.ws.rs/jakarta.ws.rs-api/2.1.1@https://javadoc.io/doc/jakarta.ws.rs/jakarta.ws.rs-api/3.1.0@g' docs/src/main/asciidoc/resteasy-reactive.adoc @@ -357,7 +361,7 @@ git cherry-pick -x ${JAKARTA_10_CDI_HASH} ## JAX-RS/RESTEasy Reactive git fetch origin jakarta-10-jaxrs -git rev-list e466a63792db2e5d87eb0b662384618f16aaa419..origin/jakarta-10-jaxrs | tac | xargs git cherry-pick -x +git rev-list 1ac748346b91512957121e9b2f68c3b960c41565..origin/jakarta-10-jaxrs | tac | xargs git cherry-pick -x # Build phase