This is an automated email from the ASF dual-hosted git repository.

jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git


The following commit(s) were added to refs/heads/main by this push:
     new 9cc28b480e Add Jolokia native support
9cc28b480e is described below

commit 9cc28b480e7d65c60519a68afc867f2a01183796
Author: James Netherton <jamesnether...@gmail.com>
AuthorDate: Thu Feb 27 14:38:30 2025 +0000

    Add Jolokia native support
    
    Fixes #7001
---
 .../ROOT/pages/reference/extensions/jolokia.adoc   |  25 +-
 .../pages/reference/extensions/management.adoc     |  12 +
 .../jolokia/deployment/JolokiaProcessor.java       | 159 ------------
 extensions-jvm/pom.xml                             |   1 -
 .../jolokia/deployment/pom.xml                     |   0
 .../jolokia/deployment/JolokiaProcessor.java       | 287 +++++++++++++++++++++
 .../jolokia/deployment/JolokiaServerBuildItem.java |   0
 .../deployment/JolokiaServerConfigBuildItem.java   |   0
 .../jolokia/JolokiaCustomContextPathTest.java      |   0
 .../JolokiaCustomRestrictorDomainsTest.java        |  29 +--
 .../camel/quarkus/jolokia/JolokiaDisabledTest.java |   0
 .../camel/quarkus/jolokia/JolokiaEnabledTest.java  |   0
 .../JolokiaManagementEndpointDisabledTest.java     |   0
 {extensions-jvm => extensions}/jolokia/pom.xml     |   2 +-
 .../jolokia/runtime/pom.xml                        |   1 +
 .../jolokia/runtime/src/main/doc/limitations.adoc  |   5 +
 .../jolokia/runtime/src/main/doc/usage.adoc        |   0
 .../jolokia/CamelQuarkusJolokiaLogHandler.java     |   0
 .../quarkus/jolokia/CamelQuarkusJolokiaServer.java |   0
 .../camel/quarkus/jolokia/JolokiaRecorder.java     |  15 +-
 .../jolokia/JolokiaRequestRedirectHandler.java     |   0
 .../jolokia/config/JolokiaBuildTimeConfig.java     |   0
 .../jolokia/config/JolokiaRuntimeConfig.java       |   0
 .../jolokia/restrictor/CamelJolokiaRestrictor.java |   0
 .../main/resources/META-INF/quarkus-extension.yaml |   3 +-
 .../management/deployment/ManagementProcessor.java |  36 +++
 .../runtime/src/main/doc/limitations.adoc          |   6 +
 extensions/pom.xml                                 |   1 +
 integration-tests-jvm/pom.xml                      |   1 -
 .../jolokia/pom.xml                                |  27 ++
 .../component/jolokia/it/CustomLogHandler.java     |  27 +-
 .../component/jolokia/it/CustomRestrictor.java     |  17 +-
 .../component/jolokia/it/JolokiaResource.java      |   8 +
 .../component/jolokia/it/JolokiaRoutes.java        |   0
 .../src/main/resources/application.properties      |  19 ++
 .../jolokia/it/JolokiaAdditionalPropertiesIT.java  |  10 +-
 .../it/JolokiaAdditionalPropertiesTest.java        |   0
 .../jolokia/it/JolokiaCustomHostPortIT.java        |  10 +-
 .../jolokia/it/JolokiaCustomHostPortTest.java      |   0
 .../jolokia/it/JolokiaCustomLogHandlerIT.java      |  10 +-
 .../jolokia/it/JolokiaCustomLogHandlerTest.java    |  30 +--
 .../jolokia/it/JolokiaCustomRestrictorIT.java      |  10 +-
 .../jolokia/it/JolokiaCustomRestrictorTest.java    |  41 ++-
 .../jolokia/it/JolokiaDisableAutoStartIT.java      |  10 +-
 .../jolokia/it/JolokiaDisableAutoStartTest.java    |   0
 .../jolokia/it/JolokiaDisableRestrictorIT.java     |  10 +-
 .../jolokia/it/JolokiaDisableRestrictorTest.java   |   0
 .../jolokia/it/JolokiaDiscoveryDisabledIT.java     |  10 +-
 .../jolokia/it/JolokiaDiscoveryDisabledTest.java   |   0
 .../quarkus/component/jolokia/it/JolokiaIT.java    |  11 +-
 .../jolokia/it/JolokiaKubernetesClientSSLIT.java   |  10 +-
 .../jolokia/it/JolokiaKubernetesClientSSLTest.java |   0
 .../quarkus/component/jolokia/it/JolokiaTest.java  |  19 +-
 integration-tests/pom.xml                          |   1 +
 tooling/scripts/test-categories.yaml               |   1 +
 55 files changed, 549 insertions(+), 315 deletions(-)

diff --git a/docs/modules/ROOT/pages/reference/extensions/jolokia.adoc 
b/docs/modules/ROOT/pages/reference/extensions/jolokia.adoc
index 513186eef7..5dff0a8c8b 100644
--- a/docs/modules/ROOT/pages/reference/extensions/jolokia.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/jolokia.adoc
@@ -4,17 +4,17 @@
 = Jolokia
 :linkattrs:
 :cq-artifact-id: camel-quarkus-jolokia
-:cq-native-supported: false
-:cq-status: Preview
-:cq-status-deprecation: Preview
+:cq-native-supported: true
+:cq-status: Stable
+:cq-status-deprecation: Stable
 :cq-description: Expose runtime metrics and management operations via JMX with 
Jolokia
 :cq-deprecated: false
 :cq-jvm-since: 3.19.0
-:cq-native-since: n/a
+:cq-native-since: 3.19.0
 
 ifeval::[{doc-show-badges} == true]
 [.badges]
-[.badge-key]##JVM since##[.badge-supported]##3.19.0## 
[.badge-key]##Native##[.badge-unsupported]##unsupported##
+[.badge-key]##JVM since##[.badge-supported]##3.19.0## [.badge-key]##Native 
since##[.badge-supported]##3.19.0##
 endif::[]
 
 Expose runtime metrics and management operations via JMX with Jolokia
@@ -22,6 +22,10 @@ Expose runtime metrics and management operations via JMX 
with Jolokia
 [id="extensions-jolokia-maven-coordinates"]
 == Maven coordinates
 
+https://{link-quarkus-code-generator}/?extension-search=camel-quarkus-jolokia[Create
 a new project with this extension on {link-quarkus-code-generator}, 
window="_blank"]
+
+Or add the coordinates to your existing project:
+
 [source,xml]
 ----
 <dependency>
@@ -161,6 +165,17 @@ 
quarkus.camel.jolokia.kubernetes.client-principal="cn=hawtio-online.hawtio.svc"
 ----
 
 
+[id="extensions-jolokia-camel-quarkus-limitations"]
+== Camel Quarkus limitations
+
+[id="extensions-jolokia-limitations-native-mode-limitations"]
+=== Native mode limitations
+
+JMX in GraalVM is still *experimental*. Therefore, some features are not 
available in native mode.
+
+Refer to the Camel Quarkus Management extension 
xref:reference/extensions/management.adoc#extensions-management-limitations-native-mode[limitations]
 section for more details.
+
+
 [id="extensions-jolokia-additional-camel-quarkus-configuration"]
 == Additional Camel Quarkus configuration
 
diff --git a/docs/modules/ROOT/pages/reference/extensions/management.adoc 
b/docs/modules/ROOT/pages/reference/extensions/management.adoc
index c173241405..5e078113c1 100644
--- a/docs/modules/ROOT/pages/reference/extensions/management.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/management.adoc
@@ -62,3 +62,15 @@ quarkus.native.monitoring=jvmstat
 
 For more information, refer to the 
https://quarkus.io/guides/building-native-image#using-monitoring-options[Quarkus
 native guide].
 
+
+[id="extensions-management-camel-quarkus-limitations"]
+== Camel Quarkus limitations
+
+[id="extensions-management-limitations-native-mode"]
+=== Native mode
+
+JMX in GraalVM is still *experimental*. Therefore, some features are not 
available in native mode.
+
+* Operations for MBean `java.lang:type=Threading` are not fully implemented. 
Therefore, it is not possible to obtain details about application threads.
+* Various MBean attributes do not have their values implemented. For example, 
the `ClassCount` attribute values for MBean `java.lang:type=ClassLoading` are 
fixed at `0`
+
diff --git 
a/extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaProcessor.java
 
b/extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaProcessor.java
deleted file mode 100644
index 7df5e71a99..0000000000
--- 
a/extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaProcessor.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.quarkus.jolokia.deployment;
-
-import java.util.function.BooleanSupplier;
-
-import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
-import io.quarkus.deployment.Capabilities;
-import io.quarkus.deployment.Capability;
-import io.quarkus.deployment.IsDevelopment;
-import io.quarkus.deployment.IsNormal;
-import io.quarkus.deployment.annotations.BuildProducer;
-import io.quarkus.deployment.annotations.BuildStep;
-import io.quarkus.deployment.annotations.BuildSteps;
-import io.quarkus.deployment.annotations.ExecutionTime;
-import io.quarkus.deployment.annotations.Record;
-import io.quarkus.deployment.builditem.ApplicationInfoBuildItem;
-import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
-import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
-import io.quarkus.kubernetes.spi.KubernetesPortBuildItem;
-import io.quarkus.vertx.http.deployment.BodyHandlerBuildItem;
-import io.quarkus.vertx.http.deployment.NonApplicationRootPathBuildItem;
-import io.quarkus.vertx.http.deployment.RouteBuildItem;
-import jakarta.enterprise.context.ApplicationScoped;
-import org.apache.camel.quarkus.core.JvmOnlyRecorder;
-import org.apache.camel.quarkus.jolokia.CamelQuarkusJolokiaServer;
-import org.apache.camel.quarkus.jolokia.JolokiaRecorder;
-import org.apache.camel.quarkus.jolokia.config.JolokiaBuildTimeConfig;
-import org.apache.camel.quarkus.jolokia.config.JolokiaRuntimeConfig;
-import org.jboss.logging.Logger;
-
-@BuildSteps(onlyIf = JolokiaProcessor.JolokiaEnabled.class)
-public class JolokiaProcessor {
-    private static final Logger LOG = Logger.getLogger(JolokiaProcessor.class);
-    private static final String FEATURE = "camel-jolokia";
-
-    @BuildStep
-    FeatureBuildItem feature() {
-        return new FeatureBuildItem(FEATURE);
-    }
-
-    @BuildStep
-    @Record(ExecutionTime.RUNTIME_INIT)
-    JolokiaServerConfigBuildItem createJolokiaServerConfig(
-            ApplicationInfoBuildItem applicationInfo,
-            JolokiaBuildTimeConfig buildTimeConfig,
-            JolokiaRuntimeConfig config,
-            JolokiaRecorder recorder) {
-        return new JolokiaServerConfigBuildItem(
-                recorder.createJolokiaServerConfig(config, 
buildTimeConfig.path(), applicationInfo.getName()));
-    }
-
-    @BuildStep
-    @Record(ExecutionTime.RUNTIME_INIT)
-    JolokiaServerBuildItem createJolokiaServer(
-            JolokiaServerConfigBuildItem jolokiaServerConfig,
-            JolokiaRecorder recorder) {
-        return new 
JolokiaServerBuildItem(recorder.createJolokiaServer(jolokiaServerConfig.getRuntimeValue()));
-    }
-
-    @BuildStep
-    @Record(ExecutionTime.RUNTIME_INIT)
-    void startJolokiaServer(
-            JolokiaServerBuildItem jolokiaServer,
-            JolokiaRuntimeConfig runtimeConfig,
-            BuildProducer<SyntheticBeanBuildItem> syntheticBean,
-            JolokiaRecorder recorder) {
-        recorder.startJolokiaServer(jolokiaServer.getRuntimeValue(), 
runtimeConfig);
-        
syntheticBean.produce(SyntheticBeanBuildItem.configure(CamelQuarkusJolokiaServer.class)
-                .scope(ApplicationScoped.class)
-                
.runtimeValue(recorder.createJolokiaServerBean(jolokiaServer.getRuntimeValue()))
-                .setRuntimeInit()
-                .done());
-    }
-
-    @BuildStep(onlyIfNot = { IsNormal.class, IsDevelopment.class })
-    @Record(ExecutionTime.RUNTIME_INIT)
-    void registerJolokiaServerShutdownHook(
-            JolokiaServerBuildItem jolokiaServer,
-            ShutdownContextBuildItem shutdownContextBuildItem,
-            JolokiaRecorder recorder) {
-        
recorder.registerJolokiaServerShutdownHook(jolokiaServer.getRuntimeValue(), 
shutdownContextBuildItem);
-    }
-
-    @BuildStep(onlyIf = JolokiaManagementEndpointEnabled.class)
-    @Record(ExecutionTime.RUNTIME_INIT)
-    void createManagementRoute(
-            JolokiaServerConfigBuildItem jolokiaServerConfig,
-            NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem,
-            BodyHandlerBuildItem bodyHandler,
-            Capabilities capabilities,
-            BuildProducer<RouteBuildItem> routes,
-            JolokiaBuildTimeConfig buildTimeConfig,
-            JolokiaRecorder recorder) {
-
-        if (capabilities.isPresent(Capability.VERTX_HTTP)) {
-            String jolokiaEndpointPath = 
nonApplicationRootPathBuildItem.resolvePath(buildTimeConfig.path());
-            routes.produce(nonApplicationRootPathBuildItem.routeBuilder()
-                    .management()
-                    .routeFunction(buildTimeConfig.path() + "/*", 
recorder.route(bodyHandler.getHandler()))
-                    
.handler(recorder.getHandler(jolokiaServerConfig.getRuntimeValue(), 
jolokiaEndpointPath))
-                    .build());
-        }
-    }
-
-    @BuildStep(onlyIf = { IsNormal.class, ExposeContainerPortEnabled.class })
-    KubernetesPortBuildItem configureJolokiaKubernetesPort() {
-        return KubernetesPortBuildItem.fromRuntimeConfiguration("jolokia", 
"quarkus.camel.jolokia.server.port", 8778, true);
-    }
-
-    @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
-    @Record(value = ExecutionTime.RUNTIME_INIT)
-    void warnJvmInNative(JvmOnlyRecorder recorder) {
-        JvmOnlyRecorder.warnJvmInNative(LOG, FEATURE);
-        recorder.warnJvmInNative(FEATURE);
-    }
-
-    static final class JolokiaEnabled implements BooleanSupplier {
-        JolokiaBuildTimeConfig config;
-
-        @Override
-        public boolean getAsBoolean() {
-            return config.enabled();
-        }
-    }
-
-    static final class JolokiaManagementEndpointEnabled implements 
BooleanSupplier {
-        JolokiaBuildTimeConfig config;
-
-        @Override
-        public boolean getAsBoolean() {
-            return config.registerManagementEndpoint();
-        }
-    }
-
-    static final class ExposeContainerPortEnabled implements BooleanSupplier {
-        JolokiaBuildTimeConfig config;
-
-        @Override
-        public boolean getAsBoolean() {
-            return config.kubernetes().exposeContainerPort();
-        }
-    }
-}
diff --git a/extensions-jvm/pom.xml b/extensions-jvm/pom.xml
index d3760bda0b..cd510e91fc 100644
--- a/extensions-jvm/pom.xml
+++ b/extensions-jvm/pom.xml
@@ -69,7 +69,6 @@
         <module>jcr</module>
         <module>jgroups</module>
         <module>jgroups-raft</module>
-        <module>jolokia</module>
         <module>jooq</module>
         <module>json-patch</module>
         <module>jsonapi</module>
diff --git a/extensions-jvm/jolokia/deployment/pom.xml 
b/extensions/jolokia/deployment/pom.xml
similarity index 100%
rename from extensions-jvm/jolokia/deployment/pom.xml
rename to extensions/jolokia/deployment/pom.xml
diff --git 
a/extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaProcessor.java
 
b/extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaProcessor.java
new file mode 100644
index 0000000000..5e6a81d72e
--- /dev/null
+++ 
b/extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaProcessor.java
@@ -0,0 +1,287 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.quarkus.jolokia.deployment;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.function.BooleanSupplier;
+import java.util.stream.Collectors;
+
+import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
+import io.quarkus.deployment.Capabilities;
+import io.quarkus.deployment.Capability;
+import io.quarkus.deployment.IsDevelopment;
+import io.quarkus.deployment.IsNormal;
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.BuildSteps;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.ApplicationInfoBuildItem;
+import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
+import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
+import io.quarkus.deployment.builditem.NativeMonitoringBuildItem;
+import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
+import 
io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
+import io.quarkus.deployment.pkg.NativeConfig;
+import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
+import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
+import io.quarkus.kubernetes.spi.KubernetesPortBuildItem;
+import io.quarkus.maven.dependency.ResolvedDependency;
+import io.quarkus.paths.PathFilter;
+import io.quarkus.paths.PathVisit;
+import io.quarkus.paths.PathVisitor;
+import io.quarkus.vertx.http.deployment.BodyHandlerBuildItem;
+import io.quarkus.vertx.http.deployment.NonApplicationRootPathBuildItem;
+import io.quarkus.vertx.http.deployment.RouteBuildItem;
+import jakarta.enterprise.context.ApplicationScoped;
+import org.apache.camel.quarkus.jolokia.CamelQuarkusJolokiaServer;
+import org.apache.camel.quarkus.jolokia.JolokiaRecorder;
+import org.apache.camel.quarkus.jolokia.config.JolokiaBuildTimeConfig;
+import org.apache.camel.quarkus.jolokia.config.JolokiaRuntimeConfig;
+import org.apache.camel.quarkus.jolokia.restrictor.CamelJolokiaRestrictor;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.StringHelper;
+import org.jboss.jandex.ClassInfo;
+import org.jboss.jandex.DotName;
+import org.jolokia.server.core.service.api.LogHandler;
+import org.jolokia.server.core.service.api.Restrictor;
+import org.jolokia.server.core.service.impl.QuietLogHandler;
+import org.jolokia.server.core.service.serializer.Serializer;
+import org.jolokia.service.history.History;
+import org.jolokia.service.history.HistoryMBean;
+
+@BuildSteps(onlyIf = JolokiaProcessor.JolokiaEnabled.class)
+public class JolokiaProcessor {
+    private static final String FEATURE = "camel-jolokia";
+
+    @BuildStep
+    FeatureBuildItem feature() {
+        return new FeatureBuildItem(FEATURE);
+    }
+
+    @BuildStep
+    @Record(ExecutionTime.RUNTIME_INIT)
+    JolokiaServerConfigBuildItem createJolokiaServerConfig(
+            ApplicationInfoBuildItem applicationInfo,
+            JolokiaBuildTimeConfig buildTimeConfig,
+            JolokiaRuntimeConfig config,
+            JolokiaRecorder recorder) {
+        return new JolokiaServerConfigBuildItem(
+                recorder.createJolokiaServerConfig(config, 
buildTimeConfig.path(), applicationInfo.getName()));
+    }
+
+    @BuildStep
+    @Record(ExecutionTime.RUNTIME_INIT)
+    JolokiaServerBuildItem createJolokiaServer(
+            JolokiaServerConfigBuildItem jolokiaServerConfig,
+            JolokiaRecorder recorder) {
+        return new 
JolokiaServerBuildItem(recorder.createJolokiaServer(jolokiaServerConfig.getRuntimeValue()));
+    }
+
+    @BuildStep
+    @Record(ExecutionTime.RUNTIME_INIT)
+    void startJolokiaServer(
+            JolokiaServerBuildItem jolokiaServer,
+            JolokiaRuntimeConfig runtimeConfig,
+            BuildProducer<SyntheticBeanBuildItem> syntheticBean,
+            JolokiaRecorder recorder) {
+        recorder.startJolokiaServer(jolokiaServer.getRuntimeValue(), 
runtimeConfig);
+        
syntheticBean.produce(SyntheticBeanBuildItem.configure(CamelQuarkusJolokiaServer.class)
+                .scope(ApplicationScoped.class)
+                
.runtimeValue(recorder.createJolokiaServerBean(jolokiaServer.getRuntimeValue()))
+                .setRuntimeInit()
+                .done());
+    }
+
+    @BuildStep(onlyIfNot = { IsNormal.class, IsDevelopment.class })
+    @Record(ExecutionTime.RUNTIME_INIT)
+    void registerJolokiaServerShutdownHook(
+            JolokiaServerBuildItem jolokiaServer,
+            ShutdownContextBuildItem shutdownContextBuildItem,
+            JolokiaRecorder recorder) {
+        
recorder.registerJolokiaServerShutdownHook(jolokiaServer.getRuntimeValue(), 
shutdownContextBuildItem);
+    }
+
+    @BuildStep(onlyIf = JolokiaManagementEndpointEnabled.class)
+    @Record(ExecutionTime.RUNTIME_INIT)
+    void createManagementRoute(
+            JolokiaServerConfigBuildItem jolokiaServerConfig,
+            NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem,
+            BodyHandlerBuildItem bodyHandler,
+            Capabilities capabilities,
+            BuildProducer<RouteBuildItem> routes,
+            JolokiaBuildTimeConfig buildTimeConfig,
+            JolokiaRecorder recorder) {
+
+        if (capabilities.isPresent(Capability.VERTX_HTTP)) {
+            String jolokiaEndpointPath = 
nonApplicationRootPathBuildItem.resolvePath(buildTimeConfig.path());
+            routes.produce(nonApplicationRootPathBuildItem.routeBuilder()
+                    .management()
+                    .routeFunction(buildTimeConfig.path() + "/*", 
recorder.route(bodyHandler.getHandler()))
+                    
.handler(recorder.getHandler(jolokiaServerConfig.getRuntimeValue(), 
jolokiaEndpointPath))
+                    .build());
+        }
+    }
+
+    @BuildStep(onlyIf = { IsNormal.class, ExposeContainerPortEnabled.class })
+    KubernetesPortBuildItem configureJolokiaKubernetesPort() {
+        return KubernetesPortBuildItem.fromRuntimeConfiguration("jolokia", 
"quarkus.camel.jolokia.server.port", 8778, true);
+    }
+
+    @BuildStep
+    IndexDependencyBuildItem indexJolokiaServerCore() {
+        return new IndexDependencyBuildItem("org.jolokia", 
"jolokia-server-core");
+    }
+
+    @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
+    void jolokiaNativeSupport(
+            CombinedIndexBuildItem combinedIndex,
+            CurateOutcomeBuildItem curateOutcome,
+            BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+            BuildProducer<NativeImageResourceBuildItem> nativeImageResource,
+            BuildProducer<NativeMonitoringBuildItem> nativeMonitoring) {
+
+        // Enable JMX server, without this some Java runtime MBean attributes 
& operations are not available
+        nativeMonitoring.produce(new 
NativeMonitoringBuildItem(NativeConfig.MonitoringOption.JMXSERVER));
+
+        // Register Jolokia service support
+        configureJolokiaServiceNativeSupport(curateOutcome, reflectiveClass, 
nativeImageResource);
+
+        // Register Jolokia MBean reflective support
+        reflectiveClass.produce(
+                ReflectiveClassBuildItem
+                        .builder(Serializer.class, History.class, 
HistoryMBean.class)
+                        .methods(true)
+                        .build());
+
+        // Register custom (non-OSGi) Jolokia Restrictor impls for reflection
+        Set<String> jolokiaRestrictorClasses = combinedIndex.getIndex()
+                .getAllKnownImplementors(Restrictor.class)
+                .stream()
+                .map(ClassInfo::name)
+                .map(DotName::toString)
+                .filter(className -> 
!className.startsWith("org.jolokia.server.core.osgi"))
+                .collect(Collectors.toSet());
+
+        jolokiaRestrictorClasses.add(CamelJolokiaRestrictor.class.getName());
+        
reflectiveClass.produce(ReflectiveClassBuildItem.builder(jolokiaRestrictorClasses.toArray(new
 String[0])).build());
+
+        // Register custom LogHandler classes for reflection
+        Set<String> jolokiaLogHandlerClasses = combinedIndex.getIndex()
+                .getAllKnownImplementors(LogHandler.class)
+                .stream()
+                .map(ClassInfo::name)
+                .map(DotName::toString)
+                .filter(className -> !className.startsWith("org.jolokia"))
+                .collect(Collectors.toSet());
+
+        jolokiaLogHandlerClasses.add(QuietLogHandler.class.getName());
+        
reflectiveClass.produce(ReflectiveClassBuildItem.builder(jolokiaLogHandlerClasses.toArray(new
 String[0])).build());
+
+        // Include Jolokia static configuration defaults
+        nativeImageResource.produce(new 
NativeImageResourceBuildItem("default-jolokia-agent.properties"));
+        nativeImageResource.produce(new 
NativeImageResourceBuildItem("version.properties"));
+    }
+
+    private static void configureJolokiaServiceNativeSupport(
+            CurateOutcomeBuildItem curateOutcome,
+            BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+            BuildProducer<NativeImageResourceBuildItem> nativeImageResource) {
+
+        Set<String> jolokiaServiceIncludes = 
Collections.singleton("META-INF/jolokia/*");
+        PathFilter pathFilter = PathFilter.forIncludes(jolokiaServiceIncludes);
+
+        Set<ResolvedDependency> jolokiaDependencies = 
curateOutcome.getApplicationModel()
+                .getRuntimeDependencies()
+                .stream()
+                .filter(dependency -> 
dependency.getGroupId().equals("org.jolokia"))
+                .collect(Collectors.toUnmodifiableSet());
+
+        Set<String> jolokiaReflectiveClasses = new HashSet<>();
+        for (ResolvedDependency dependency : jolokiaDependencies) {
+            dependency.getContentTree(pathFilter).walk(new PathVisitor() {
+                @Override
+                public void visitPath(PathVisit visit) {
+                    String resourcePath = 
StringHelper.after(visit.getPath().toString(), "/");
+                    nativeImageResource.produce(new 
NativeImageResourceBuildItem(resourcePath));
+
+                    try {
+                        for (String line : 
Files.readAllLines(visit.getPath())) {
+                            if (ObjectHelper.isEmpty(line) || 
line.startsWith("#")) {
+                                continue;
+                            }
+
+                            String serviceClass;
+                            if (line.indexOf(',') > -1) {
+                                serviceClass = line.substring(0, 
line.indexOf(',')).trim();
+                            } else {
+                                serviceClass = line.trim();
+                            }
+
+                            jolokiaReflectiveClasses.add(serviceClass);
+                        }
+                    } catch (IOException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+            });
+        }
+
+        if (!jolokiaReflectiveClasses.isEmpty()) {
+            
reflectiveClass.produce(ReflectiveClassBuildItem.builder(jolokiaReflectiveClasses.toArray(new
 String[0])).build());
+        }
+    }
+
+    @BuildStep
+    void registerServices(BuildProducer<ServiceProviderBuildItem> 
serviceProvider) {
+        
serviceProvider.produce(ServiceProviderBuildItem.allProvidersFromClassPath(Serializer.class.getName()));
+    }
+
+    static final class JolokiaEnabled implements BooleanSupplier {
+        JolokiaBuildTimeConfig config;
+
+        @Override
+        public boolean getAsBoolean() {
+            return config.enabled();
+        }
+    }
+
+    static final class JolokiaManagementEndpointEnabled implements 
BooleanSupplier {
+        JolokiaBuildTimeConfig config;
+
+        @Override
+        public boolean getAsBoolean() {
+            return config.registerManagementEndpoint();
+        }
+    }
+
+    static final class ExposeContainerPortEnabled implements BooleanSupplier {
+        JolokiaBuildTimeConfig config;
+
+        @Override
+        public boolean getAsBoolean() {
+            return config.kubernetes().exposeContainerPort();
+        }
+    }
+}
diff --git 
a/extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerBuildItem.java
 
b/extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerBuildItem.java
similarity index 100%
rename from 
extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerBuildItem.java
rename to 
extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerBuildItem.java
diff --git 
a/extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerConfigBuildItem.java
 
b/extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerConfigBuildItem.java
similarity index 100%
rename from 
extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerConfigBuildItem.java
rename to 
extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerConfigBuildItem.java
diff --git 
a/extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomContextPathTest.java
 
b/extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomContextPathTest.java
similarity index 100%
rename from 
extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomContextPathTest.java
rename to 
extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomContextPathTest.java
diff --git 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
 
b/extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomRestrictorDomainsTest.java
similarity index 73%
copy from 
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
copy to 
extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomRestrictorDomainsTest.java
index 526ac4b69d..f9824ddc2e 100644
--- 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
+++ 
b/extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomRestrictorDomainsTest.java
@@ -14,29 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.jolokia.it;
+package org.apache.camel.quarkus.jolokia;
 
-import java.util.Map;
-
-import io.quarkus.test.junit.QuarkusTest;
-import io.quarkus.test.junit.QuarkusTestProfile;
-import io.quarkus.test.junit.TestProfile;
+import io.quarkus.test.QuarkusUnitTest;
 import io.restassured.RestAssured;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.hamcrest.Matchers.equalTo;
 
-@TestProfile(JolokiaCustomRestrictorDomainsTest.JolokiaAdditionalPropertiesProfile.class)
-@QuarkusTest
 class JolokiaCustomRestrictorDomainsTest {
-    @BeforeEach
-    public void beforeEach() {
-        RestAssured.port = 8778;
-    }
+    @RegisterExtension
+    static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
+            .withEmptyApplication()
+            
.overrideConfigKey("quarkus.camel.jolokia.camel-restrictor-allowed-mbean-domains",
 "org.apache.camel");
 
     @Test
     void customMBeanAllowDomains() {
+        RestAssured.port = 8778;
+
         // Verify org.apache.camel domain allowed
         RestAssured.given()
                 
.get("/jolokia/read/org.apache.camel:context=camel-1,type=context,name=\"camel-1\"/CamelId")
@@ -62,11 +58,4 @@ class JolokiaCustomRestrictorDomainsTest {
                 .body(
                         "status", equalTo(403));
     }
-
-    public static final class JolokiaAdditionalPropertiesProfile implements 
QuarkusTestProfile {
-        @Override
-        public Map<String, String> getConfigOverrides() {
-            return 
Map.of("quarkus.camel.jolokia.camel-restrictor-allowed-mbean-domains", 
"org.apache.camel");
-        }
-    }
 }
diff --git 
a/extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaDisabledTest.java
 
b/extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaDisabledTest.java
similarity index 100%
rename from 
extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaDisabledTest.java
rename to 
extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaDisabledTest.java
diff --git 
a/extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaEnabledTest.java
 
b/extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaEnabledTest.java
similarity index 100%
rename from 
extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaEnabledTest.java
rename to 
extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaEnabledTest.java
diff --git 
a/extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaManagementEndpointDisabledTest.java
 
b/extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaManagementEndpointDisabledTest.java
similarity index 100%
rename from 
extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaManagementEndpointDisabledTest.java
rename to 
extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaManagementEndpointDisabledTest.java
diff --git a/extensions-jvm/jolokia/pom.xml b/extensions/jolokia/pom.xml
similarity index 96%
rename from extensions-jvm/jolokia/pom.xml
rename to extensions/jolokia/pom.xml
index 7984aea82b..8cba00c919 100644
--- a/extensions-jvm/jolokia/pom.xml
+++ b/extensions/jolokia/pom.xml
@@ -21,7 +21,7 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.camel.quarkus</groupId>
-        <artifactId>camel-quarkus-extensions-jvm</artifactId>
+        <artifactId>camel-quarkus-extensions</artifactId>
         <version>3.20.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
diff --git a/extensions-jvm/jolokia/runtime/pom.xml 
b/extensions/jolokia/runtime/pom.xml
similarity index 98%
rename from extensions-jvm/jolokia/runtime/pom.xml
rename to extensions/jolokia/runtime/pom.xml
index 46737d640d..65fa1b4bfe 100644
--- a/extensions-jvm/jolokia/runtime/pom.xml
+++ b/extensions/jolokia/runtime/pom.xml
@@ -32,6 +32,7 @@
 
     <properties>
         <camel.quarkus.jvmSince>3.19.0</camel.quarkus.jvmSince>
+        <camel.quarkus.nativeSince>3.19.0</camel.quarkus.nativeSince>
     </properties>
 
     <dependencies>
diff --git a/extensions/jolokia/runtime/src/main/doc/limitations.adoc 
b/extensions/jolokia/runtime/src/main/doc/limitations.adoc
new file mode 100644
index 0000000000..18de811134
--- /dev/null
+++ b/extensions/jolokia/runtime/src/main/doc/limitations.adoc
@@ -0,0 +1,5 @@
+=== Native mode limitations
+
+JMX in GraalVM is still *experimental*. Therefore, some features are not 
available in native mode.
+
+Refer to the Camel Quarkus Management extension 
xref:reference/extensions/management.adoc#extensions-management-limitations-native-mode[limitations]
 section for more details.
diff --git a/extensions-jvm/jolokia/runtime/src/main/doc/usage.adoc 
b/extensions/jolokia/runtime/src/main/doc/usage.adoc
similarity index 100%
rename from extensions-jvm/jolokia/runtime/src/main/doc/usage.adoc
rename to extensions/jolokia/runtime/src/main/doc/usage.adoc
diff --git 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
 
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
similarity index 100%
copy from 
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
copy to 
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
diff --git 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaServer.java
 
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaServer.java
similarity index 100%
rename from 
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaServer.java
rename to 
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaServer.java
diff --git 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRecorder.java
 
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRecorder.java
similarity index 92%
rename from 
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRecorder.java
rename to 
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRecorder.java
index ee7c7687bc..c2e1cf6ce5 100644
--- 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRecorder.java
+++ 
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRecorder.java
@@ -45,6 +45,7 @@ import org.jboss.logging.Logger;
 import org.jolokia.jvmagent.JolokiaServer;
 import org.jolokia.jvmagent.JolokiaServerConfig;
 import org.jolokia.server.core.config.ConfigKey;
+import org.jolokia.server.core.service.api.LogHandler;
 
 import static io.smallrye.common.os.Linux.isWSL;
 
@@ -135,7 +136,13 @@ public class JolokiaRecorder {
 
     public RuntimeValue<JolokiaServer> 
createJolokiaServer(RuntimeValue<JolokiaServerConfig> serverConfig) {
         try {
-            CamelQuarkusJolokiaAgent agent = new 
CamelQuarkusJolokiaAgent(serverConfig.getValue());
+            CamelQuarkusJolokiaAgent agent;
+            if 
(serverConfig.getValue().getJolokiaConfig().containsKey(ConfigKey.LOGHANDLER_CLASS))
 {
+                agent = new CamelQuarkusJolokiaAgent(serverConfig.getValue());
+            } else {
+                agent = new CamelQuarkusJolokiaAgent(serverConfig.getValue(), 
new CamelQuarkusJolokiaLogHandler());
+            }
+
             return new RuntimeValue<>(agent);
         } catch (IOException e) {
             throw new RuntimeException(e);
@@ -158,7 +165,11 @@ public class JolokiaRecorder {
 
     static final class CamelQuarkusJolokiaAgent extends JolokiaServer {
         CamelQuarkusJolokiaAgent(JolokiaServerConfig config) throws 
IOException {
-            super(config, new CamelQuarkusJolokiaLogHandler());
+            super(config);
+        }
+
+        CamelQuarkusJolokiaAgent(JolokiaServerConfig config, LogHandler 
logHandler) throws IOException {
+            super(config, logHandler);
         }
     }
 
diff --git 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRequestRedirectHandler.java
 
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRequestRedirectHandler.java
similarity index 100%
rename from 
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRequestRedirectHandler.java
rename to 
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRequestRedirectHandler.java
diff --git 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaBuildTimeConfig.java
 
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaBuildTimeConfig.java
similarity index 100%
rename from 
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaBuildTimeConfig.java
rename to 
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaBuildTimeConfig.java
diff --git 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaRuntimeConfig.java
 
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaRuntimeConfig.java
similarity index 100%
rename from 
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaRuntimeConfig.java
rename to 
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaRuntimeConfig.java
diff --git 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/restrictor/CamelJolokiaRestrictor.java
 
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/restrictor/CamelJolokiaRestrictor.java
similarity index 100%
rename from 
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/restrictor/CamelJolokiaRestrictor.java
rename to 
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/restrictor/CamelJolokiaRestrictor.java
diff --git 
a/extensions-jvm/jolokia/runtime/src/main/resources/META-INF/quarkus-extension.yaml
 b/extensions/jolokia/runtime/src/main/resources/META-INF/quarkus-extension.yaml
similarity index 97%
rename from 
extensions-jvm/jolokia/runtime/src/main/resources/META-INF/quarkus-extension.yaml
rename to 
extensions/jolokia/runtime/src/main/resources/META-INF/quarkus-extension.yaml
index 93c5bd3ca6..e83199059c 100644
--- 
a/extensions-jvm/jolokia/runtime/src/main/resources/META-INF/quarkus-extension.yaml
+++ 
b/extensions/jolokia/runtime/src/main/resources/META-INF/quarkus-extension.yaml
@@ -26,9 +26,8 @@ description: "Expose runtime metrics and management 
operations via JMX with Jolo
 metadata:
   icon-url: 
"https://raw.githubusercontent.com/apache/camel-website/main/antora-ui-camel/src/img/logo-d.svg";
   sponsor: "Apache Software Foundation"
-  unlisted: true
   guide: 
"https://camel.apache.org/camel-quarkus/latest/reference/extensions/jolokia.html";
   categories:
   - "integration"
   status:
-  - "preview"
+  - "stable"
diff --git 
a/extensions/management/deployment/src/main/java/org/apache/camel/quarkus/component/management/deployment/ManagementProcessor.java
 
b/extensions/management/deployment/src/main/java/org/apache/camel/quarkus/component/management/deployment/ManagementProcessor.java
index 5190026dc3..a6392da8cf 100644
--- 
a/extensions/management/deployment/src/main/java/org/apache/camel/quarkus/component/management/deployment/ManagementProcessor.java
+++ 
b/extensions/management/deployment/src/main/java/org/apache/camel/quarkus/component/management/deployment/ManagementProcessor.java
@@ -16,10 +16,17 @@
  */
 package org.apache.camel.quarkus.component.management.deployment;
 
+import java.io.NotSerializableException;
+import java.io.ObjectStreamException;
 import java.lang.reflect.Modifier;
 import java.rmi.NotBoundException;
+import java.util.Collections;
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.AbstractOwnableSynchronizer;
+import java.util.concurrent.locks.AbstractQueuedSynchronizer;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -40,9 +47,15 @@ import io.quarkus.deployment.annotations.Record;
 import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
 import io.quarkus.deployment.builditem.NativeMonitoringBuildItem;
+import io.quarkus.deployment.builditem.RemovedResourceBuildItem;
 import 
io.quarkus.deployment.builditem.nativeimage.NativeImageProxyDefinitionBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
 import io.quarkus.deployment.pkg.NativeConfig;
+import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
+import io.quarkus.maven.dependency.ArtifactKey;
+import jakarta.transaction.NotSupportedException;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.RuntimeExchangeException;
 import org.apache.camel.api.management.ManagedAttribute;
 import org.apache.camel.api.management.ManagedNotification;
 import org.apache.camel.api.management.ManagedNotifications;
@@ -67,15 +80,31 @@ class ManagementProcessor {
             ManagedResource.class
     };
     private static final String[] SERIALIZATION_CLASSES = {
+            AbstractOwnableSynchronizer.class.getName(),
+            AbstractQueuedSynchronizer.class.getName(),
+            "java.util.concurrent.ConcurrentHashMap$CollectionView",
+            ConcurrentHashMap.class.getName(),
+            "java.util.concurrent.ConcurrentHashMap$KeySetView",
+            "java.util.concurrent.ConcurrentHashMap$Segment",
             DescriptorSupport.class.getName(),
             ModelMBeanAttributeInfo.class.getName(),
             ModelMBeanInfoSupport.class.getName(),
             ModelMBeanOperationInfo.class.getName(),
             MBeanException.class.getName(),
             MBeanServerNotification.class.getName(),
+            NoSuchMethodException.class.getName(),
             NotBoundException.class.getName(),
+            NotSerializableException.class.getName(),
+            NotSupportedException.class.getName(),
             Object.class.getName(),
             ObjectInstance.class.getName(),
+            ObjectStreamException.class.getName(),
+            ReentrantLock.class.getName(),
+            "java.util.concurrent.locks.ReentrantLock$NonfairSync",
+            "java.util.concurrent.locks.ReentrantLock$Sync",
+            RuntimeCamelException.class.getName(),
+            RuntimeExchangeException.class.getName(),
+            "java.util.Collections$UnmodifiableSet",
     };
 
     @BuildStep
@@ -132,6 +161,13 @@ class ManagementProcessor {
         return new 
NativeMonitoringBuildItem(NativeConfig.MonitoringOption.JMXSERVER);
     }
 
+    // TODO: Remove this https://github.com/apache/camel-quarkus/issues/7054
+    @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
+    RemovedResourceBuildItem removedResources() {
+        return new 
RemovedResourceBuildItem(ArtifactKey.fromString("io.quarkus:quarkus-core"),
+                
Collections.singleton("io/quarkus/runtime/graal/Target_javax_management_JMX.class"));
+    }
+
     private Set<String> getManagedTypes(IndexView index, Predicate<ClassInfo> 
typeFilter) {
         return Stream.of(CAMEL_MANAGEMENT_ANNOTATIONS)
                 .flatMap(annotation -> 
index.getAnnotations(annotation).stream())
diff --git a/extensions/management/runtime/src/main/doc/limitations.adoc 
b/extensions/management/runtime/src/main/doc/limitations.adoc
new file mode 100644
index 0000000000..b1696f25eb
--- /dev/null
+++ b/extensions/management/runtime/src/main/doc/limitations.adoc
@@ -0,0 +1,6 @@
+=== Native mode
+
+JMX in GraalVM is still *experimental*. Therefore, some features are not 
available in native mode.
+
+* Operations for MBean `java.lang:type=Threading` are not fully implemented. 
Therefore, it is not possible to obtain details about application threads.
+* Various MBean attributes do not have their values implemented. For example, 
the `ClassCount` attribute values for MBean `java.lang:type=ClassLoading` are 
fixed at `0`
diff --git a/extensions/pom.xml b/extensions/pom.xml
index 63ffb06d9d..e3e8649111 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -148,6 +148,7 @@
         <module>jfr</module>
         <module>jira</module>
         <module>jms</module>
+        <module>jolokia</module>
         <module>jolt</module>
         <module>joor</module>
         <module>jpa</module>
diff --git a/integration-tests-jvm/pom.xml b/integration-tests-jvm/pom.xml
index 5c65077232..47b086967e 100644
--- a/integration-tests-jvm/pom.xml
+++ b/integration-tests-jvm/pom.xml
@@ -68,7 +68,6 @@
         <module>jcr</module>
         <module>jgroups</module>
         <module>jgroups-raft</module>
-        <module>jolokia</module>
         <module>jooq</module>
         <module>json-patch</module>
         <module>jsonapi</module>
diff --git a/integration-tests-jvm/jolokia/pom.xml 
b/integration-tests/jolokia/pom.xml
similarity index 84%
rename from integration-tests-jvm/jolokia/pom.xml
rename to integration-tests/jolokia/pom.xml
index 272d60d2f2..cae98b7e6c 100644
--- a/integration-tests-jvm/jolokia/pom.xml
+++ b/integration-tests/jolokia/pom.xml
@@ -127,6 +127,33 @@
                 </dependency>
             </dependencies>
         </profile>
+        <profile>
+            <id>native</id>
+            <activation>
+                <property>
+                    <name>native</name>
+                </property>
+            </activation>
+            <properties>
+                <quarkus.native.enabled>true</quarkus.native.enabled>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-failsafe-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>integration-test</goal>
+                                    <goal>verify</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
     </profiles>
 
 </project>
diff --git 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
 
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/CustomLogHandler.java
similarity index 62%
rename from 
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
rename to 
integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/CustomLogHandler.java
index 3b66e757ea..747430525f 100644
--- 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
+++ 
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/CustomLogHandler.java
@@ -14,31 +14,36 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.jolokia;
+package org.apache.camel.quarkus.component.jolokia.it;
+
+import java.util.concurrent.atomic.AtomicBoolean;
 
-import org.jboss.logging.Logger;
 import org.jolokia.server.core.service.api.LogHandler;
 
-final class CamelQuarkusJolokiaLogHandler implements LogHandler {
-    private static final Logger LOG = 
Logger.getLogger(CamelQuarkusJolokiaLogHandler.class);
+public class CustomLogHandler implements LogHandler {
+    public static AtomicBoolean MESSAGE_LOGGED = new AtomicBoolean(false);
 
     @Override
-    public void debug(String s) {
-        LOG.debug(s);
+    public void debug(String message) {
+        MESSAGE_LOGGED.set(true);
     }
 
     @Override
-    public void info(String s) {
-        LOG.info(s);
+    public void info(String message) {
+        MESSAGE_LOGGED.set(true);
     }
 
     @Override
-    public void error(String s, Throwable throwable) {
-        LOG.error(s);
+    public void error(String message, Throwable t) {
+        MESSAGE_LOGGED.set(true);
     }
 
     @Override
     public boolean isDebug() {
-        return LOG.isDebugEnabled();
+        return true;
+    }
+
+    public static Boolean isMessageLogged() {
+        return MESSAGE_LOGGED.get();
     }
 }
diff --git 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
 
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/CustomRestrictor.java
similarity index 68%
copy from 
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to 
integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/CustomRestrictor.java
index 439d1155d4..65fa5bf047 100644
--- 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++ 
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/CustomRestrictor.java
@@ -16,12 +16,19 @@
  */
 package org.apache.camel.quarkus.component.jolokia.it;
 
-import org.apache.camel.builder.RouteBuilder;
+import javax.management.ObjectName;
 
-public class JolokiaRoutes extends RouteBuilder {
+import org.jolokia.server.core.restrictor.AllowAllRestrictor;
+
+/**
+ * Only allows MBean operation sendStringBody.
+ */
+public class CustomRestrictor extends AllowAllRestrictor {
     @Override
-    public void configure() throws Exception {
-        from("direct:start")
-                .to("seda:end");
+    public boolean isOperationAllowed(ObjectName pName, String pOperation) {
+        if (pOperation.startsWith("sendStringBody")) {
+            return true;
+        }
+        return false;
     }
 }
diff --git 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaResource.java
 
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaResource.java
similarity index 86%
rename from 
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaResource.java
rename to 
integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaResource.java
index f97be0810c..5b52d90446 100644
--- 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaResource.java
+++ 
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaResource.java
@@ -23,6 +23,7 @@ import jakarta.ws.rs.POST;
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
 import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.quarkus.jolokia.CamelQuarkusJolokiaServer;
 
@@ -53,4 +54,11 @@ public class JolokiaResource {
     public void stop() {
         server.stop();
     }
+
+    @Path("/custom/logger/activated")
+    @GET
+    public Response isCustomLoggerActivated() {
+        int statusCode = CustomLogHandler.isMessageLogged() ? 200 : 404;
+        return Response.status(statusCode).build();
+    }
 }
diff --git 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
 
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
similarity index 100%
copy from 
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to 
integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
diff --git 
a/integration-tests/jolokia/src/main/resources/application.properties 
b/integration-tests/jolokia/src/main/resources/application.properties
new file mode 100644
index 0000000000..6c0534afa0
--- /dev/null
+++ b/integration-tests/jolokia/src/main/resources/application.properties
@@ -0,0 +1,19 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You 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.
+## ---------------------------------------------------------------------------
+
+# Enable in all modes since native testing runs against prod mode and this 
simplifies test assertions
+quarkus.camel.jolokia.server.discovery-enabled-mode=all
diff --git 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesIT.java
similarity index 79%
copy from 
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesIT.java
index 439d1155d4..6b902ab018 100644
--- 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++ 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesIT.java
@@ -16,12 +16,8 @@
  */
 package org.apache.camel.quarkus.component.jolokia.it;
 
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
 
-public class JolokiaRoutes extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        from("direct:start")
-                .to("seda:end");
-    }
+@QuarkusIntegrationTest
+class JolokiaAdditionalPropertiesIT extends JolokiaAdditionalPropertiesTest {
 }
diff --git 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
similarity index 100%
copy from 
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
copy to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
diff --git 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortIT.java
similarity index 79%
copy from 
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortIT.java
index 439d1155d4..ce064baade 100644
--- 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++ 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortIT.java
@@ -16,12 +16,8 @@
  */
 package org.apache.camel.quarkus.component.jolokia.it;
 
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
 
-public class JolokiaRoutes extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        from("direct:start")
-                .to("seda:end");
-    }
+@QuarkusIntegrationTest
+class JolokiaCustomHostPortIT extends JolokiaCustomHostPortTest {
 }
diff --git 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortTest.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortTest.java
similarity index 100%
rename from 
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortTest.java
rename to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortTest.java
diff --git 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomLogHandlerIT.java
similarity index 79%
copy from 
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomLogHandlerIT.java
index 439d1155d4..108cf3ae9c 100644
--- 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++ 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomLogHandlerIT.java
@@ -16,12 +16,8 @@
  */
 package org.apache.camel.quarkus.component.jolokia.it;
 
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
 
-public class JolokiaRoutes extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        from("direct:start")
-                .to("seda:end");
-    }
+@QuarkusIntegrationTest
+class JolokiaCustomLogHandlerIT extends JolokiaCustomLogHandlerTest {
 }
diff --git 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomLogHandlerTest.java
similarity index 66%
rename from 
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
rename to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomLogHandlerTest.java
index 03d45d578c..2a5e1376c4 100644
--- 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
+++ 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomLogHandlerTest.java
@@ -16,38 +16,32 @@
  */
 package org.apache.camel.quarkus.component.jolokia.it;
 
+import java.time.Duration;
 import java.util.Map;
 
 import io.quarkus.test.junit.QuarkusTest;
 import io.quarkus.test.junit.QuarkusTestProfile;
 import io.quarkus.test.junit.TestProfile;
 import io.restassured.RestAssured;
-import org.junit.jupiter.api.BeforeEach;
+import org.awaitility.Awaitility;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.Matchers.equalTo;
-
-@TestProfile(JolokiaAdditionalPropertiesTest.JolokiaAdditionalPropertiesProfile.class)
+@TestProfile(JolokiaCustomLogHandlerTest.JolokiaCustomLogHandlerProfile.class)
 @QuarkusTest
-class JolokiaAdditionalPropertiesTest {
-    @BeforeEach
-    public void beforeEach() {
-        RestAssured.port = 8778;
-    }
-
+class JolokiaCustomLogHandlerTest {
     @Test
-    void additionalProperties() {
-        RestAssured.given()
-                .get("/jolokia/")
-                .then()
-                .statusCode(200)
-                .body("value.config.maxDepth", equalTo("10"));
+    void customLogHandler() {
+        
Awaitility.await().pollInterval(Duration.ofMillis(250)).atMost(Duration.ofSeconds(10)).untilAsserted(()
 -> {
+            RestAssured.get("/jolokia/custom/logger/activated")
+                    .then()
+                    .statusCode(200);
+        });
     }
 
-    public static final class JolokiaAdditionalPropertiesProfile implements 
QuarkusTestProfile {
+    public static final class JolokiaCustomLogHandlerProfile implements 
QuarkusTestProfile {
         @Override
         public Map<String, String> getConfigOverrides() {
-            return 
Map.of("quarkus.camel.jolokia.additional-properties.maxDepth", "10");
+            return 
Map.of("quarkus.camel.jolokia.additional-properties.logHandlerClass", 
CustomLogHandler.class.getName());
         }
     }
 }
diff --git 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorIT.java
similarity index 79%
copy from 
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorIT.java
index 439d1155d4..26162f4b4f 100644
--- 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++ 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorIT.java
@@ -16,12 +16,8 @@
  */
 package org.apache.camel.quarkus.component.jolokia.it;
 
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
 
-public class JolokiaRoutes extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        from("direct:start")
-                .to("seda:end");
-    }
+@QuarkusIntegrationTest
+class JolokiaCustomRestrictorIT extends JolokiaCustomRestrictorTest {
 }
diff --git 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorTest.java
similarity index 52%
rename from 
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
rename to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorTest.java
index 526ac4b69d..0b63f2c869 100644
--- 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
+++ 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorTest.java
@@ -22,51 +22,48 @@ import io.quarkus.test.junit.QuarkusTest;
 import io.quarkus.test.junit.QuarkusTestProfile;
 import io.quarkus.test.junit.TestProfile;
 import io.restassured.RestAssured;
+import io.restassured.http.ContentType;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import static org.apache.camel.builder.Builder.body;
 import static org.hamcrest.Matchers.equalTo;
 
-@TestProfile(JolokiaCustomRestrictorDomainsTest.JolokiaAdditionalPropertiesProfile.class)
+@TestProfile(JolokiaCustomRestrictorTest.JolokiaCustomRestrictorProfile.class)
 @QuarkusTest
-class JolokiaCustomRestrictorDomainsTest {
+class JolokiaCustomRestrictorTest {
     @BeforeEach
     public void beforeEach() {
         RestAssured.port = 8778;
     }
 
     @Test
-    void customMBeanAllowDomains() {
-        // Verify org.apache.camel domain allowed
+    void customRestrictorDeniesOperationAccess() {
+        // sendStringBody operations should be allowed
+        String sendStringBodyPayload = 
"{\"type\":\"exec\",\"mbean\":\"org.apache.camel:context=camel-1,type=context,name=\\\"camel-1\\\"\",\"operation\":\"sendStringBody(java.lang.String,
 java.lang.String)\",\"arguments\":[\"direct://start\",\"Hello World\"]}";
         RestAssured.given()
-                
.get("/jolokia/read/org.apache.camel:context=camel-1,type=context,name=\"camel-1\"/CamelId")
+                .contentType(ContentType.JSON)
+                .body(sendStringBodyPayload)
+                .post("/jolokia/")
                 .then()
                 .statusCode(200)
-                .body(
-                        "status", equalTo(200),
-                        "value", equalTo("camel-1"));
+                .body("status", equalTo(200));
 
-        // Verify java.lang domain disallowed
+        // All other operations should be disallowed
+        String dumpRoutesAsXmlPayload = 
"{\"type\":\"exec\",\"mbean\":\"org.apache.camel:context=camel-1,type=context,name=\\\"camel-1\\\"\",\"operation\":\"dumpRoutesAsXml()\",\"arguments\":[]}";
         RestAssured.given()
-                
.get("/jolokia/read/java.lang:type=ClassLoading/LoadedClassCount")
+                .contentType(ContentType.JSON)
+                .body(dumpRoutesAsXmlPayload)
+                .post("/jolokia/")
                 .then()
                 .statusCode(200)
-                .body(
-                        "status", equalTo(403));
-
-        // Verify java.nio domain disallowed
-        RestAssured.given()
-                
.get("/jolokia/read/java.nio:type=BufferPool,name=direct/MemoryUsed")
-                .then()
-                .statusCode(200)
-                .body(
-                        "status", equalTo(403));
+                .body("status", equalTo(403));
     }
 
-    public static final class JolokiaAdditionalPropertiesProfile implements 
QuarkusTestProfile {
+    public static final class JolokiaCustomRestrictorProfile implements 
QuarkusTestProfile {
         @Override
         public Map<String, String> getConfigOverrides() {
-            return 
Map.of("quarkus.camel.jolokia.camel-restrictor-allowed-mbean-domains", 
"org.apache.camel");
+            return 
Map.of("quarkus.camel.jolokia.additional-properties.restrictorClass", 
CustomRestrictor.class.getName());
         }
     }
 }
diff --git 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartIT.java
similarity index 79%
copy from 
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartIT.java
index 439d1155d4..5473e7ac7b 100644
--- 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++ 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartIT.java
@@ -16,12 +16,8 @@
  */
 package org.apache.camel.quarkus.component.jolokia.it;
 
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
 
-public class JolokiaRoutes extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        from("direct:start")
-                .to("seda:end");
-    }
+@QuarkusIntegrationTest
+class JolokiaDisableAutoStartIT extends JolokiaDisableAutoStartTest {
 }
diff --git 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartTest.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartTest.java
similarity index 100%
rename from 
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartTest.java
rename to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartTest.java
diff --git 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorIT.java
similarity index 79%
copy from 
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorIT.java
index 439d1155d4..5c841f6f92 100644
--- 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++ 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorIT.java
@@ -16,12 +16,8 @@
  */
 package org.apache.camel.quarkus.component.jolokia.it;
 
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
 
-public class JolokiaRoutes extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        from("direct:start")
-                .to("seda:end");
-    }
+@QuarkusIntegrationTest
+class JolokiaDisableRestrictorIT extends JolokiaDisableRestrictorTest {
 }
diff --git 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorTest.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorTest.java
similarity index 100%
rename from 
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorTest.java
rename to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorTest.java
diff --git 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledIT.java
similarity index 79%
copy from 
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledIT.java
index 439d1155d4..1226fd5490 100644
--- 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++ 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledIT.java
@@ -16,12 +16,8 @@
  */
 package org.apache.camel.quarkus.component.jolokia.it;
 
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
 
-public class JolokiaRoutes extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        from("direct:start")
-                .to("seda:end");
-    }
+@QuarkusIntegrationTest
+class JolokiaDiscoveryDisabledIT extends JolokiaDiscoveryDisabledTest {
 }
diff --git 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledTest.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledTest.java
similarity index 100%
rename from 
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledTest.java
rename to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledTest.java
diff --git 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaIT.java
similarity index 79%
copy from 
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaIT.java
index 439d1155d4..497e052474 100644
--- 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++ 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaIT.java
@@ -16,12 +16,9 @@
  */
 package org.apache.camel.quarkus.component.jolokia.it;
 
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
+
+@QuarkusIntegrationTest
+class JolokiaIT extends JolokiaTest {
 
-public class JolokiaRoutes extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        from("direct:start")
-                .to("seda:end");
-    }
 }
diff --git 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLIT.java
similarity index 79%
rename from 
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
rename to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLIT.java
index 439d1155d4..7b218e7a0c 100644
--- 
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++ 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLIT.java
@@ -16,12 +16,8 @@
  */
 package org.apache.camel.quarkus.component.jolokia.it;
 
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
 
-public class JolokiaRoutes extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        from("direct:start")
-                .to("seda:end");
-    }
+@QuarkusIntegrationTest
+class JolokiaKubernetesClientSSLIT extends JolokiaKubernetesClientSSLTest {
 }
diff --git 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLTest.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLTest.java
similarity index 100%
rename from 
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLTest.java
rename to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLTest.java
diff --git 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
similarity index 85%
rename from 
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
rename to 
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
index 6b3c686941..6ea2d18e07 100644
--- 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
+++ 
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.quarkus.component.jolokia.it;
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import io.restassured.http.ContentType;
+import io.restassured.path.json.JsonPath;
 import org.apache.camel.quarkus.jolokia.restrictor.CamelJolokiaRestrictor;
 import org.eclipse.microprofile.config.ConfigProvider;
 import org.junit.jupiter.api.BeforeEach;
@@ -26,6 +27,8 @@ import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.matchesPattern;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 @QuarkusTest
 class JolokiaTest {
@@ -45,7 +48,7 @@ class JolokiaTest {
                         "value.config.discoveryEnabled", equalTo("true"),
                         "value.config.restrictorClass", 
equalTo(CamelJolokiaRestrictor.class.getName()),
                         "value.config.agentDescription", 
equalTo("camel-quarkus-integration-test-jolokia"),
-                        "value.details.url", 
equalTo("http://127.0.0.1:8778/jolokia/";));
+                        "value.details.url", 
matchesPattern("http://.*:8778/jolokia/";));
     }
 
     @Test
@@ -79,13 +82,19 @@ class JolokiaTest {
                         "value", greaterThanOrEqualTo(0));
 
         // Verify java.nio domain
-        RestAssured.given()
+        JsonPath response = RestAssured.given()
                 
.get("/jolokia/read/java.nio:type=BufferPool,name=direct/MemoryUsed")
                 .then()
                 .statusCode(200)
-                .body(
-                        "status", equalTo(200),
-                        "value", greaterThanOrEqualTo(0));
+                .extract()
+                .body()
+                .jsonPath();
+
+        // java.nio MBeans are not available in native mode so the Jolokia 
status must be checked
+        int status = response.getInt("status");
+        if (status == 200) {
+            assertTrue(response.getInt("value") >= 0);
+        }
 
         // Disallowed domain
         RestAssured.given()
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index bd7004633f..eed4141ab6 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -129,6 +129,7 @@
         <module>jms-artemis-ra</module>
         <module>jms-ibmmq-client</module>
         <module>jms-qpid-amqp-client</module>
+        <module>jolokia</module>
         <module>jolt</module>
         <module>joor</module>
         <module>jpa</module>
diff --git a/tooling/scripts/test-categories.yaml 
b/tooling/scripts/test-categories.yaml
index 8f21c3ca9c..31463339e8 100644
--- a/tooling/scripts/test-categories.yaml
+++ b/tooling/scripts/test-categories.yaml
@@ -177,6 +177,7 @@ group-10:
   - fop
   - google-secret-manager
   - groovy
+  - jolokia
   - joor
   - mail
   - main-unknown-args-fail

Reply via email to