From 8ac46e2b1df4e63e8627265e218ebd1fa8538a89 Mon Sep 17 00:00:00 2001 From: Peter Palaga Date: Wed, 12 Feb 2025 14:02:03 +0100 Subject: [PATCH] Native build fails when using quarkus-cxf-integration-tracing-opentelemetry and quarkus-jdbc-oracle, fix #1697 --- bom/pom.xml | 10 ++ .../deployment/pom.xml | 4 + .../runtime/pom.xml | 4 + extensions/pom.xml | 1 + extensions/rt-management/deployment/pom.xml | 43 ++++++++ .../QuarkusCxfRtManagementProcessor.java | 98 +++++++++++++++++++ extensions/rt-management/pom.xml | 20 ++++ extensions/rt-management/runtime/pom.xml | 59 +++++++++++ .../resources/META-INF/quarkus-extension.yaml | 12 +++ extensions/ws-rm/deployment/pom.xml | 4 + .../WsReliableMessagingProcessor.java | 3 +- extensions/ws-rm/runtime/pom.xml | 4 + integration-tests/opentelemetry/pom.xml | 5 +- .../src/main/resources/application.properties | 1 + 14 files changed, 265 insertions(+), 3 deletions(-) create mode 100644 extensions/rt-management/deployment/pom.xml create mode 100644 extensions/rt-management/deployment/src/main/java/io/quarkiverse/cxf/rt/management/deployment/QuarkusCxfRtManagementProcessor.java create mode 100644 extensions/rt-management/pom.xml create mode 100644 extensions/rt-management/runtime/pom.xml create mode 100644 extensions/rt-management/runtime/src/main/resources/META-INF/quarkus-extension.yaml diff --git a/bom/pom.xml b/bom/pom.xml index f6d79f563..a3fec449a 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -189,6 +189,16 @@ quarkus-cxf-rt-features-metrics-deployment ${quarkus-cxf.version} + + io.quarkiverse.cxf + quarkus-cxf-rt-management + ${quarkus-cxf.version} + + + io.quarkiverse.cxf + quarkus-cxf-rt-management-deployment + ${quarkus-cxf.version} + io.quarkiverse.cxf quarkus-cxf-rt-transports-http-hc5 diff --git a/extensions/integration-tracing-opentelemetry/deployment/pom.xml b/extensions/integration-tracing-opentelemetry/deployment/pom.xml index 68ccdea33..1bdb98b33 100644 --- a/extensions/integration-tracing-opentelemetry/deployment/pom.xml +++ b/extensions/integration-tracing-opentelemetry/deployment/pom.xml @@ -16,6 +16,10 @@ io.quarkiverse.cxf quarkus-cxf-deployment + + io.quarkiverse.cxf + quarkus-cxf-rt-management-deployment + io.quarkiverse.cxf quarkus-cxf-integration-tracing-opentelemetry diff --git a/extensions/integration-tracing-opentelemetry/runtime/pom.xml b/extensions/integration-tracing-opentelemetry/runtime/pom.xml index 017310851..e40a94c86 100644 --- a/extensions/integration-tracing-opentelemetry/runtime/pom.xml +++ b/extensions/integration-tracing-opentelemetry/runtime/pom.xml @@ -21,6 +21,10 @@ io.quarkiverse.cxf quarkus-cxf + + io.quarkiverse.cxf + quarkus-cxf-rt-management + org.apache.cxf cxf-integration-tracing-opentelemetry diff --git a/extensions/pom.xml b/extensions/pom.xml index cc8e7f40d..66f3be6e5 100644 --- a/extensions/pom.xml +++ b/extensions/pom.xml @@ -16,6 +16,7 @@ saaj santuario-xmlsec woodstox + rt-management core features-logging features-metrics diff --git a/extensions/rt-management/deployment/pom.xml b/extensions/rt-management/deployment/pom.xml new file mode 100644 index 000000000..d0a658aac --- /dev/null +++ b/extensions/rt-management/deployment/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + io.quarkiverse.cxf + quarkus-cxf-rt-management-parent + 3.18.2-SNAPSHOT + ../pom.xml + + + quarkus-cxf-rt-management-deployment + Quarkus CXF - Runtime Management - Deployment + + + + io.quarkus + quarkus-core-deployment + + + io.quarkiverse.cxf + quarkus-cxf-rt-management + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${quarkus.version} + + + + + + + + diff --git a/extensions/rt-management/deployment/src/main/java/io/quarkiverse/cxf/rt/management/deployment/QuarkusCxfRtManagementProcessor.java b/extensions/rt-management/deployment/src/main/java/io/quarkiverse/cxf/rt/management/deployment/QuarkusCxfRtManagementProcessor.java new file mode 100644 index 000000000..a368c46ac --- /dev/null +++ b/extensions/rt-management/deployment/src/main/java/io/quarkiverse/cxf/rt/management/deployment/QuarkusCxfRtManagementProcessor.java @@ -0,0 +1,98 @@ +package io.quarkiverse.cxf.rt.management.deployment; + +import java.util.function.BiFunction; +import java.util.stream.Stream; + +import org.apache.cxf.management.jmx.InstrumentationManagerImpl; +import org.jboss.logging.Logger; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.builditem.BytecodeTransformerBuildItem; +import io.quarkus.deployment.builditem.CombinedIndexBuildItem; +import io.quarkus.deployment.builditem.IndexDependencyBuildItem; +import io.quarkus.deployment.pkg.steps.NativeBuild; +import io.quarkus.gizmo.Gizmo; + +public class QuarkusCxfRtManagementProcessor { + + private static final Logger log = Logger.getLogger(QuarkusCxfRtManagementProcessor.class); + + @BuildStep + void indexDependencies(BuildProducer indexDependencies) { + Stream.of( + "org.apache.cxf:cxf-rt-management") + .forEach(ga -> { + String[] coords = ga.split(":"); + indexDependencies.produce(new IndexDependencyBuildItem(coords[0], coords[1])); + }); + } + + @BuildStep(onlyIf = NativeBuild.class) + void transfromByteCode( + CombinedIndexBuildItem combinedIndex, + BuildProducer bytecodeTransformers) { + + /* + * Make InstrumentationManagerImpl.init() a no-op in native mode + * to avoid getting an MBean Server instance in the native image heap + * See https://github.com/quarkiverse/quarkus-cxf/issues/1697 + */ + final BytecodeTransformerBuildItem transformation = new BytecodeTransformerBuildItem.Builder() + .setClassToTransform(InstrumentationManagerImpl.class.getName()) + .setCacheable(true) + .setVisitorFunction(new NoInitTransformer()) + .build(); + bytecodeTransformers.produce(transformation); + } + + static class NoInitTransformer implements BiFunction { + + @Override + public ClassVisitor apply(String t, ClassVisitor classVisitor) { + return new ClassVisitor(Gizmo.ASM_API_VERSION, classVisitor) { + private boolean initTransformed = false; + + @Override + public MethodVisitor visitMethod(int access, + String name, + String descriptor, + String signature, + String[] exceptions) { + if (name.equals("init") + && descriptor.equals("()V") + && (access & Opcodes.ACC_PUBLIC) != 0) { + initTransformed = true; + final MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); + + return new MethodVisitor(api, mv) { + + @Override + public void visitCode() { + /* Replace method body with a single RETURN to make it do nothing */ + visitInsn(Opcodes.RETURN); + visitMaxs(0, 0); + visitEnd(); + } + }; + } + return super.visitMethod(access, name, descriptor, signature, exceptions); + } + + @Override + public void visitEnd() { + if (!initTransformed) { + throw new IllegalStateException( + InstrumentationManagerImpl.class.getName() + ".init() method not found"); + } + super.visitEnd(); + } + + }; + } + } + +} diff --git a/extensions/rt-management/pom.xml b/extensions/rt-management/pom.xml new file mode 100644 index 000000000..e18991d86 --- /dev/null +++ b/extensions/rt-management/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + io.quarkiverse.cxf + quarkus-cxf-extensions + 3.18.2-SNAPSHOT + ../pom.xml + + + quarkus-cxf-rt-management-parent + Quarkus CXF - Runtime Management - Parent + pom + + + deployment + runtime + + + diff --git a/extensions/rt-management/runtime/pom.xml b/extensions/rt-management/runtime/pom.xml new file mode 100644 index 000000000..2b81ca344 --- /dev/null +++ b/extensions/rt-management/runtime/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + io.quarkiverse.cxf + quarkus-cxf-rt-management-parent + 3.18.2-SNAPSHOT + ../pom.xml + + + quarkus-cxf-rt-management + Quarkus CXF - Runtime Management + Native support for CXF Runtime Management + + + + io.quarkus + quarkus-core + + + org.apache.cxf + cxf-rt-management + + + + + + + io.quarkus + quarkus-extension-maven-plugin + + + + extension-descriptor + + compile + + ${project.groupId}:${project.artifactId}-deployment:${project.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${quarkus.version} + + + + + + + diff --git a/extensions/rt-management/runtime/src/main/resources/META-INF/quarkus-extension.yaml b/extensions/rt-management/runtime/src/main/resources/META-INF/quarkus-extension.yaml new file mode 100644 index 000000000..d422235a5 --- /dev/null +++ b/extensions/rt-management/runtime/src/main/resources/META-INF/quarkus-extension.yaml @@ -0,0 +1,12 @@ +--- +artifact: ${project.groupId}:${project.artifactId}:${project.version} +name: "Quarkus CXF Runtime Management" +description: "Native support for CXf Runtime Management" +metadata: + unlisted: true + keywords: + - "jmx" + categories: + - "jmx" + guide: "https://quarkiverse.github.io/quarkiverse-docs/quarkus-cxf/dev/index.html" + status: "stable" diff --git a/extensions/ws-rm/deployment/pom.xml b/extensions/ws-rm/deployment/pom.xml index c670b3b90..6935f4ab1 100644 --- a/extensions/ws-rm/deployment/pom.xml +++ b/extensions/ws-rm/deployment/pom.xml @@ -20,6 +20,10 @@ io.quarkiverse.cxf quarkus-cxf-rt-ws-security-deployment + + io.quarkiverse.cxf + quarkus-cxf-rt-management-deployment + io.quarkiverse.cxf quarkus-cxf-rt-ws-rm diff --git a/extensions/ws-rm/deployment/src/main/java/io/quarkiverse/cxf/ws/rm/deployment/WsReliableMessagingProcessor.java b/extensions/ws-rm/deployment/src/main/java/io/quarkiverse/cxf/ws/rm/deployment/WsReliableMessagingProcessor.java index 23491fd2c..68824ef75 100644 --- a/extensions/ws-rm/deployment/src/main/java/io/quarkiverse/cxf/ws/rm/deployment/WsReliableMessagingProcessor.java +++ b/extensions/ws-rm/deployment/src/main/java/io/quarkiverse/cxf/ws/rm/deployment/WsReliableMessagingProcessor.java @@ -25,8 +25,7 @@ FeatureBuildItem feature() { @BuildStep void indexDependencies(BuildProducer indexDependencies) { Stream.of( - "org.apache.cxf:cxf-rt-ws-rm", - "org.apache.cxf:cxf-rt-management") + "org.apache.cxf:cxf-rt-ws-rm") .forEach(ga -> { String[] coords = ga.split(":"); indexDependencies.produce(new IndexDependencyBuildItem(coords[0], coords[1])); diff --git a/extensions/ws-rm/runtime/pom.xml b/extensions/ws-rm/runtime/pom.xml index 2ae02567d..94e694a94 100644 --- a/extensions/ws-rm/runtime/pom.xml +++ b/extensions/ws-rm/runtime/pom.xml @@ -24,6 +24,10 @@ io.quarkiverse.cxf quarkus-cxf-rt-ws-security + + io.quarkiverse.cxf + quarkus-cxf-rt-management + org.apache.cxf cxf-rt-ws-rm diff --git a/integration-tests/opentelemetry/pom.xml b/integration-tests/opentelemetry/pom.xml index bb168432f..f5ecb9ba2 100644 --- a/integration-tests/opentelemetry/pom.xml +++ b/integration-tests/opentelemetry/pom.xml @@ -26,7 +26,10 @@ io.opentelemetry opentelemetry-sdk-testing - + + io.quarkus + quarkus-jdbc-oracle + io.rest-assured rest-assured diff --git a/integration-tests/opentelemetry/src/main/resources/application.properties b/integration-tests/opentelemetry/src/main/resources/application.properties index 2111f1e81..b36f96bf4 100644 --- a/integration-tests/opentelemetry/src/main/resources/application.properties +++ b/integration-tests/opentelemetry/src/main/resources/application.properties @@ -6,3 +6,4 @@ quarkus.cxf.endpoint."/hello".implementor = io.quarkiverse.cxf.opentelemetry.it. quarkus.cxf.client.hello.client-endpoint-url = http://localhost:${quarkus.http.test-port}/soap/hello quarkus.cxf.client.hello.service-interface = io.quarkiverse.cxf.opentelemetry.it.HelloService +quarkus.devservices.enabled=false \ No newline at end of file