You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2019/12/19 10:43:34 UTC

[camel-quarkus] branch master updated: Modular RoutesCollector

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

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


The following commit(s) were added to refs/heads/master by this push:
     new f3e6fce  Modular RoutesCollector
f3e6fce is described below

commit f3e6fce8cd727f577914cd43f03c486326079350
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Wed Dec 18 21:30:06 2019 +0100

    Modular RoutesCollector
    
    The aim here is to make the RoutesCollector more flexible so platform
    such as camel-k can fine tune the behavior of the collector i.e. by
    providing am ad-hoc way of discovery certain routes from the registry
---
 .../component/xml/deployment/XmlProcessor.java     |  13 +--
 ...tXmlLoader.java => DefaultXmlRoutesLoader.java} |   4 +-
 .../camel/quarkus/component/xml/XmlRecorder.java   |  12 +--
 .../quarkus/core/deployment/BuildProcessor.java    |  31 ++++--
 .../deployment/CamelRoutesLoaderBuildItems.java    |  57 +++++++++++
 .../camel/quarkus/core/CamelMainRecorder.java      |   8 +-
 .../apache/camel/quarkus/core/CamelRecorder.java   |  10 +-
 .../camel/quarkus/core/CamelRoutesCollector.java   | 104 +++++++++++++++++++++
 ...XmlLoader.java => DisabledXmlRoutesLoader.java} |   2 +-
 .../org/apache/camel/quarkus/core/FastModel.java   |   4 +-
 .../{XmlLoader.java => RegistryRoutesLoader.java}  |  13 +--
 .../camel/quarkus/core/RegistryRoutesLoaders.java  | 103 ++++++++++++++++++++
 .../core/{XmlLoader.java => XmlRoutesLoader.java}  |   2 +-
 integration-tests/core-main-collector/pom.xml      |  94 +++++++++++++++++++
 .../apache/camel/quarkus/core/CamelServlet.java    |  38 +++++---
 .../src/main/resources/application.properties      |  22 -----
 .../org/apache/camel/quarkus/core/CamelTest.java   |  33 ++++---
 .../{core-main => core-main-xml}/pom.xml           |  26 +-----
 .../apache/camel/quarkus/core/CamelServlet.java    |  72 ++++++++++++++
 .../src/main/resources/application.properties      |  18 ----
 .../org/apache/camel/quarkus/core/CamelTest.java   |  53 +++++++++++
 .../src/test/resources/my-routes.xml               |   0
 integration-tests/core-main/pom.xml                |   4 -
 .../apache/camel/quarkus/core/CamelServlet.java    |   9 ++
 .../src/main/resources/application.properties      |   1 -
 .../org/apache/camel/quarkus/core/CamelTest.java   |  29 +-----
 integration-tests/pom.xml                          |   7 ++
 .../support/core-main-collector/deployment/pom.xml |  73 +++++++++++++++
 .../core/runtime/support/deployment/Feature.java   |  20 ++--
 .../support/deployment/SupportBuildStep.java       |  32 +++----
 .../support/{ => core-main-collector}/pom.xml      |  16 +---
 .../support/core-main-collector/runtime/pom.xml    |  71 ++++++++++++++
 .../core/runtime/support/SupportRecorder.java      |  24 ++---
 .../runtime/support/SupportRoutesCollector.java    |  23 +++--
 integration-tests/support/pom.xml                  |   1 +
 35 files changed, 797 insertions(+), 232 deletions(-)

diff --git a/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java b/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java
index f43af15..ec99180 100644
--- a/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java
+++ b/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java
@@ -23,9 +23,8 @@ import io.quarkus.deployment.builditem.FeatureBuildItem;
 import io.quarkus.jaxb.deployment.JaxbFileRootBuildItem;
 import org.apache.camel.quarkus.component.xml.XmlRecorder;
 import org.apache.camel.quarkus.core.deployment.CamelModelJAXBContextFactoryBuildItem;
-import org.apache.camel.quarkus.core.deployment.CamelRoutesCollectorBuildItem;
+import org.apache.camel.quarkus.core.deployment.CamelRoutesLoaderBuildItems;
 import org.apache.camel.quarkus.core.deployment.CamelSupport;
-import org.apache.camel.quarkus.core.deployment.CamelXmlLoaderBuildItem;
 import org.apache.camel.quarkus.support.common.CamelCapabilities;
 
 class XmlProcessor {
@@ -50,14 +49,8 @@ class XmlProcessor {
 
     @BuildStep
     @Record(value = ExecutionTime.STATIC_INIT, optional = true)
-    CamelXmlLoaderBuildItem xmlLoader(XmlRecorder recorder) {
-        return new CamelXmlLoaderBuildItem(recorder.newDefaultXmlLoader());
-    }
-
-    @BuildStep
-    @Record(value = ExecutionTime.STATIC_INIT, optional = true)
-    public CamelRoutesCollectorBuildItem routesCollector(XmlRecorder recorder) {
-        return new CamelRoutesCollectorBuildItem(recorder.newDefaultRoutesCollector());
+    CamelRoutesLoaderBuildItems.Xml xmlLoader(XmlRecorder recorder) {
+        return new CamelRoutesLoaderBuildItems.Xml(recorder.newDefaultXmlLoader());
     }
 
     @BuildStep
diff --git a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlLoader.java b/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlRoutesLoader.java
similarity index 92%
copy from extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlLoader.java
copy to extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlRoutesLoader.java
index 67a329d..c9e1455 100644
--- a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlLoader.java
+++ b/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlRoutesLoader.java
@@ -22,9 +22,9 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
-import org.apache.camel.quarkus.core.XmlLoader;
+import org.apache.camel.quarkus.core.XmlRoutesLoader;
 
-public class DefaultXmlLoader implements XmlLoader {
+public class DefaultXmlRoutesLoader implements XmlRoutesLoader {
 
     @Override
     public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream is) throws Exception {
diff --git a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java b/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java
index dd5acc0..0170587 100644
--- a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java
+++ b/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java
@@ -22,11 +22,9 @@ import io.quarkus.runtime.RuntimeValue;
 import io.quarkus.runtime.annotations.Recorder;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.impl.DefaultModelJAXBContextFactory;
-import org.apache.camel.main.DefaultRoutesCollector;
-import org.apache.camel.main.RoutesCollector;
 import org.apache.camel.model.ValidateDefinition;
 import org.apache.camel.model.validator.PredicateValidatorDefinition;
-import org.apache.camel.quarkus.core.XmlLoader;
+import org.apache.camel.quarkus.core.XmlRoutesLoader;
 import org.apache.camel.reifier.ProcessorReifier;
 import org.apache.camel.reifier.ValidateReifier;
 import org.apache.camel.reifier.validator.PredicateValidatorReifier;
@@ -49,12 +47,8 @@ public class XmlRecorder {
         return new RuntimeValue<>(factory);
     }
 
-    public RuntimeValue<XmlLoader> newDefaultXmlLoader() {
-        return new RuntimeValue<>(new DefaultXmlLoader());
-    }
-
-    public RuntimeValue<RoutesCollector> newDefaultRoutesCollector() {
-        return new RuntimeValue<>(new DefaultRoutesCollector());
+    public RuntimeValue<XmlRoutesLoader> newDefaultXmlLoader() {
+        return new RuntimeValue<>(new DefaultXmlRoutesLoader());
     }
 
     public void initXmlReifiers() {
diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
index fb83ff4..8fd37d3 100644
--- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
+++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
@@ -57,7 +57,6 @@ import org.apache.camel.quarkus.core.CoreAttachmentsRecorder;
 import org.apache.camel.quarkus.core.Flags;
 import org.apache.camel.quarkus.core.UploadAttacher;
 import org.apache.camel.quarkus.support.common.CamelCapabilities;
-import org.apache.camel.spi.Registry;
 import org.apache.camel.spi.TypeConverterLoader;
 import org.apache.camel.spi.TypeConverterRegistry;
 import org.jboss.jandex.ClassInfo;
@@ -187,7 +186,7 @@ class BuildProcessor {
                 List<CamelBeanBuildItem> registryItems,
                 List<CamelServiceFilterBuildItem> serviceFilters) {
 
-            final RuntimeValue<Registry> registry = recorder.createRegistry();
+            final RuntimeValue<org.apache.camel.spi.Registry> registry = recorder.createRegistry();
 
             CamelSupport.services(applicationArchives)
                     .filter(si -> !containerBeans.getBeans().contains(si))
@@ -238,8 +237,8 @@ class BuildProcessor {
         @Overridable
         @BuildStep
         @Record(value = ExecutionTime.STATIC_INIT, optional = true)
-        public CamelXmlLoaderBuildItem createXmlLoader(CamelRecorder recorder) {
-            return new CamelXmlLoaderBuildItem(recorder.newDisabledXmlLoader());
+        public CamelRoutesLoaderBuildItems.Xml createXmlLoader(CamelRecorder recorder) {
+            return new CamelRoutesLoaderBuildItems.Xml(recorder.newDisabledXmlRoutesLoader());
         }
 
         @BuildStep
@@ -258,14 +257,14 @@ class BuildProcessor {
                 CamelRegistryBuildItem registry,
                 CamelTypeConverterRegistryBuildItem typeConverterRegistry,
                 CamelModelJAXBContextFactoryBuildItem contextFactory,
-                CamelXmlLoaderBuildItem xmlLoader,
+                CamelRoutesLoaderBuildItems.Xml xmlLoader,
                 BeanContainerBuildItem beanContainer) {
 
             RuntimeValue<CamelContext> context = recorder.createContext(
                     registry.getRegistry(),
                     typeConverterRegistry.getRegistry(),
                     contextFactory.getContextFactory(),
-                    xmlLoader.getXmlLoader(),
+                    xmlLoader.getLoader(),
                     beanContainer.getValue());
 
             return new CamelContextBuildItem(context);
@@ -301,6 +300,12 @@ class BuildProcessor {
      * disabled by setting quarkus.camel.disable-main = true
      */
     public static class Main {
+        @Overridable
+        @BuildStep
+        @Record(value = ExecutionTime.STATIC_INIT, optional = true)
+        public CamelRoutesLoaderBuildItems.Registry createRegistryLoader(CamelRecorder recorder) {
+            return new CamelRoutesLoaderBuildItems.Registry(recorder.newDefaultRegistryRoutesLoader());
+        }
 
         @BuildStep(onlyIf = { Flags.MainEnabled.class, Flags.RoutesDiscoveryEnabled.class })
         public List<CamelRoutesBuilderClassBuildItem> discoverRoutesBuilderClassNames(
@@ -330,8 +335,13 @@ class BuildProcessor {
         @Overridable
         @BuildStep
         @Record(value = ExecutionTime.STATIC_INIT, optional = true)
-        public CamelRoutesCollectorBuildItem createRoutesCollector(CamelMainRecorder recorder) {
-            return new CamelRoutesCollectorBuildItem(recorder.newDisabledXmlRoutesCollector());
+        public CamelRoutesCollectorBuildItem createRoutesCollector(
+                CamelMainRecorder recorder,
+                CamelRoutesLoaderBuildItems.Registry registryRoutesLoader,
+                CamelRoutesLoaderBuildItems.Xml xmlRoutesLoader) {
+
+            return new CamelRoutesCollectorBuildItem(
+                    recorder.newRoutesCollector(registryRoutesLoader.getLoader(), xmlRoutesLoader.getLoader()));
         }
 
         @BuildStep(onlyIf = Flags.MainEnabled.class)
@@ -399,8 +409,9 @@ class BuildProcessor {
          *
          * @param recorder the recorder.
          * @param main a reference to a {@link CamelMain}.
-         * @param registry a reference to a {@link Registry}; note that this parameter is here as placeholder to
-         *            ensure the {@link Registry} is fully configured before starting camel-main.
+         * @param registry a reference to a {@link org.apache.camel.spi.Registry}; note that this parameter is here as
+         *            placeholder to
+         *            ensure the {@link org.apache.camel.spi.Registry} is fully configured before starting camel-main.
          * @param executor the {@link org.apache.camel.spi.ReactiveExecutor} to be configured on camel-main, this
          *            happens during {@link ExecutionTime#RUNTIME_INIT} because the executor may need to start
          *            threads and so on.
diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java
new file mode 100644
index 0000000..815cff7
--- /dev/null
+++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java
@@ -0,0 +1,57 @@
+/*
+ * 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.core.deployment;
+
+import io.quarkus.builder.item.SimpleBuildItem;
+import io.quarkus.runtime.RuntimeValue;
+import org.apache.camel.quarkus.core.RegistryRoutesLoader;
+import org.apache.camel.quarkus.core.XmlRoutesLoader;
+
+public final class CamelRoutesLoaderBuildItems {
+    private CamelRoutesLoaderBuildItems() {
+    }
+
+    /**
+     * Holds the {@link RegistryRoutesLoader} instance.
+     */
+    public static final class Registry extends SimpleBuildItem {
+        private final RuntimeValue<RegistryRoutesLoader> value;
+
+        public Registry(RuntimeValue<RegistryRoutesLoader> value) {
+            this.value = value;
+        }
+
+        public RuntimeValue<RegistryRoutesLoader> getLoader() {
+            return value;
+        }
+    }
+
+    /**
+     * Holds the {@link XmlRoutesLoader} instance.
+     */
+    public static final class Xml extends SimpleBuildItem {
+        private final RuntimeValue<XmlRoutesLoader> value;
+
+        public Xml(RuntimeValue<XmlRoutesLoader> value) {
+            this.value = value;
+        }
+
+        public RuntimeValue<XmlRoutesLoader> getLoader() {
+            return value;
+        }
+    }
+}
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java
index 7d4c906..484a300 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java
@@ -95,7 +95,11 @@ public class CamelMainRecorder {
         }
     }
 
-    public RuntimeValue<RoutesCollector> newDisabledXmlRoutesCollector() {
-        return new RuntimeValue<>(new DisabledXmlRoutesCollector());
+    public RuntimeValue<RoutesCollector> newRoutesCollector(
+            RuntimeValue<RegistryRoutesLoader> registryRoutesLoader,
+            RuntimeValue<XmlRoutesLoader> xmlRoutesLoader) {
+
+        return new RuntimeValue<>(new CamelRoutesCollector(registryRoutesLoader.getValue(), xmlRoutesLoader.getValue()));
     }
+
 }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
index c22926f..56e6304 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
@@ -49,7 +49,7 @@ public class CamelRecorder {
             RuntimeValue<Registry> registry,
             RuntimeValue<TypeConverterRegistry> typeConverterRegistry,
             RuntimeValue<ModelJAXBContextFactory> contextFactory,
-            RuntimeValue<XmlLoader> xmlLoader,
+            RuntimeValue<XmlRoutesLoader> xmlLoader,
             BeanContainer beanContainer) {
         FastCamelContext context = new FastCamelContext();
         context.setRegistry(registry.getValue());
@@ -106,7 +106,11 @@ public class CamelRecorder {
         return new RuntimeValue<>(new DisabledModelJAXBContextFactory());
     }
 
-    public RuntimeValue<XmlLoader> newDisabledXmlLoader() {
-        return new RuntimeValue<>(new DisabledXmlLoader());
+    public RuntimeValue<XmlRoutesLoader> newDisabledXmlRoutesLoader() {
+        return new RuntimeValue<>(new DisabledXmlRoutesLoader());
+    }
+
+    public RuntimeValue<RegistryRoutesLoader> newDefaultRegistryRoutesLoader() {
+        return new RuntimeValue<>(new RegistryRoutesLoaders.Default());
     }
 }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java
new file mode 100644
index 0000000..8f63cea
--- /dev/null
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java
@@ -0,0 +1,104 @@
+/*
+ * 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.core;
+
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.main.RoutesCollector;
+import org.apache.camel.model.RoutesDefinition;
+import org.apache.camel.model.rest.RestsDefinition;
+import org.apache.camel.spi.PackageScanResourceResolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CamelRoutesCollector implements RoutesCollector {
+    private static final Logger LOGGER = LoggerFactory.getLogger(CamelRoutesCollector.class);
+
+    private final RegistryRoutesLoader registryRoutesLoader;
+    private final XmlRoutesLoader xmlRoutesLoader;
+
+    public CamelRoutesCollector(RegistryRoutesLoader registryRoutesLoader, XmlRoutesLoader xmlRoutesLoader) {
+        this.registryRoutesLoader = registryRoutesLoader;
+        this.xmlRoutesLoader = xmlRoutesLoader;
+    }
+
+    public RegistryRoutesLoader getRegistryRoutesLoader() {
+        return registryRoutesLoader;
+    }
+
+    public XmlRoutesLoader getXmlRoutesLoader() {
+        return xmlRoutesLoader;
+    }
+
+    @Override
+    public List<RoutesBuilder> collectRoutesFromRegistry(
+            CamelContext camelContext,
+            String excludePattern,
+            String includePattern) {
+
+        return registryRoutesLoader.collectRoutesFromRegistry(camelContext, excludePattern, includePattern);
+    }
+
+    @Override
+    public List<RoutesDefinition> collectXmlRoutesFromDirectory(CamelContext camelContext, String directory) {
+        List<RoutesDefinition> answer = new ArrayList<>();
+        PackageScanResourceResolver resolver = camelContext.adapt(ExtendedCamelContext.class).getPackageScanResourceResolver();
+
+        for (String part : directory.split(",")) {
+            LOGGER.info("Loading additional Camel XML routes from: {}", part);
+            try {
+                for (InputStream is : resolver.findResources(part)) {
+                    answer.add(xmlRoutesLoader.loadRoutesDefinition(camelContext, is));
+                }
+            } catch (FileNotFoundException e) {
+                LOGGER.debug("No XML routes found in {}. Skipping XML routes detection.", part);
+            } catch (Exception e) {
+                throw RuntimeCamelException.wrapRuntimeException(e);
+            }
+        }
+
+        return answer;
+    }
+
+    @Override
+    public List<RestsDefinition> collectXmlRestsFromDirectory(CamelContext camelContext, String directory) {
+        List<RestsDefinition> answer = new ArrayList<>();
+        PackageScanResourceResolver resolver = camelContext.adapt(ExtendedCamelContext.class).getPackageScanResourceResolver();
+
+        for (String part : directory.split(",")) {
+            LOGGER.info("Loading additional Camel XML rests from: {}", part);
+            try {
+                for (InputStream is : resolver.findResources(part)) {
+                    answer.add(xmlRoutesLoader.loadRestsDefinition(camelContext, is));
+                }
+            } catch (FileNotFoundException e) {
+                LOGGER.debug("No XML rests found in {}. Skipping XML rests detection.", part);
+            } catch (Exception e) {
+                throw RuntimeCamelException.wrapRuntimeException(e);
+            }
+        }
+
+        return answer;
+    }
+}
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesLoader.java
similarity index 95%
copy from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java
copy to extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesLoader.java
index 3b2e4de..b470294 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesLoader.java
@@ -22,7 +22,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
 
-public class DisabledXmlLoader implements XmlLoader {
+public class DisabledXmlRoutesLoader implements XmlRoutesLoader {
 
     @Override
     public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception {
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java
index 05f5aa4..182f252 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java
@@ -41,9 +41,9 @@ import org.apache.camel.support.CamelContextHelper;
 
 public class FastModel extends BaseModel {
 
-    private final XmlLoader xmlLoader;
+    private final XmlRoutesLoader xmlLoader;
 
-    public FastModel(CamelContext camelContext, XmlLoader xmlLoader) {
+    public FastModel(CamelContext camelContext, XmlRoutesLoader xmlLoader) {
         super(camelContext);
         this.xmlLoader = xmlLoader;
     }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/RegistryRoutesLoader.java
similarity index 70%
copy from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java
copy to extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/RegistryRoutesLoader.java
index 09ed32e..58f45dc 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/RegistryRoutesLoader.java
@@ -16,16 +16,11 @@
  */
 package org.apache.camel.quarkus.core;
 
-import java.io.InputStream;
+import java.util.List;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
-
-public interface XmlLoader {
-
-    RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception;
-
-    RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception;
+import org.apache.camel.RoutesBuilder;
 
+public interface RegistryRoutesLoader {
+    List<RoutesBuilder> collectRoutesFromRegistry(CamelContext camelContext, String excludePattern, String includePattern);
 }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/RegistryRoutesLoaders.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/RegistryRoutesLoaders.java
new file mode 100644
index 0000000..2167689
--- /dev/null
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/RegistryRoutesLoaders.java
@@ -0,0 +1,103 @@
+/*
+ * 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.core;
+
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.util.AntPathMatcher;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class RegistryRoutesLoaders {
+    private RegistryRoutesLoaders() {
+    }
+
+    public static final class Disabled implements RegistryRoutesLoader {
+        @Override
+        public List<RoutesBuilder> collectRoutesFromRegistry(
+                CamelContext camelContext,
+                String excludePattern,
+                String includePattern) {
+
+            return Collections.emptyList();
+        }
+    }
+
+    public static final class Default implements RegistryRoutesLoader {
+        private static final Logger LOGGER = LoggerFactory.getLogger(Default.class);
+
+        @Override
+        public List<RoutesBuilder> collectRoutesFromRegistry(
+                CamelContext camelContext,
+                String excludePattern,
+                String includePattern) {
+
+            final List<RoutesBuilder> routes = new ArrayList<>();
+            final AntPathMatcher matcher = new AntPathMatcher();
+
+            Set<RoutesBuilder> builders = camelContext.getRegistry().findByType(RoutesBuilder.class);
+            for (RoutesBuilder routesBuilder : builders) {
+                // filter out abstract classes
+                boolean abs = Modifier.isAbstract(routesBuilder.getClass().getModifiers());
+                if (!abs) {
+                    String name = routesBuilder.getClass().getName();
+                    // make name as path so we can use ant path matcher
+                    name = name.replace('.', '/');
+
+                    boolean match = !"false".equals(includePattern);
+                    // exclude take precedence over include
+                    if (match && ObjectHelper.isNotEmpty(excludePattern)) {
+                        // there may be multiple separated by comma
+                        String[] parts = excludePattern.split(",");
+                        for (String part : parts) {
+                            // must negate when excluding, and hence !
+                            match = !matcher.match(part, name);
+                            LOGGER.trace("Java RoutesBuilder: {} exclude filter: {} -> {}", name, part, match);
+                            if (!match) {
+                                break;
+                            }
+                        }
+                    }
+                    if (match && ObjectHelper.isNotEmpty(includePattern)) {
+                        // there may be multiple separated by comma
+                        String[] parts = includePattern.split(",");
+                        for (String part : parts) {
+                            match = matcher.match(part, name);
+                            LOGGER.trace("Java RoutesBuilder: {} include filter: {} -> {}", name, part, match);
+                            if (match) {
+                                break;
+                            }
+                        }
+                    }
+                    LOGGER.debug("Java RoutesBuilder: {} accepted by include/exclude filter: {}", name, match);
+                    if (match) {
+                        routes.add(routesBuilder);
+                    }
+                }
+            }
+
+            return routes;
+        }
+    }
+}
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlRoutesLoader.java
similarity index 97%
copy from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java
copy to extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlRoutesLoader.java
index 09ed32e..36a2c1d 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlRoutesLoader.java
@@ -22,7 +22,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
 
-public interface XmlLoader {
+public interface XmlRoutesLoader {
 
     RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception;
 
diff --git a/integration-tests/core-main-collector/pom.xml b/integration-tests/core-main-collector/pom.xml
new file mode 100644
index 0000000..72746c0
--- /dev/null
+++ b/integration-tests/core-main-collector/pom.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache.camel.quarkus</groupId>
+        <artifactId>camel-quarkus-integration-tests</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>camel-quarkus-integration-test-core-main-collector</artifactId>
+    <name>Camel Quarkus :: Integration Tests :: Core Main Collector :: Tests</name>
+    <description>The camel integration tests</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-integration-test-support-core-main-collector-ext</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-direct</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-log</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-timer</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-jsonb</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-resteasy-jsonb</artifactId>
+        </dependency>
+
+        <!-- test dependencies -->
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.rest-assured</groupId>
+            <artifactId>rest-assured</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>build</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java b/integration-tests/core-main-collector/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
similarity index 54%
copy from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java
copy to integration-tests/core-main-collector/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
index 3b2e4de..9f57961 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java
+++ b/integration-tests/core-main-collector/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
@@ -16,22 +16,34 @@
  */
 package org.apache.camel.quarkus.core;
 
-import java.io.InputStream;
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.json.Json;
+import javax.json.JsonObject;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
+import org.apache.camel.spi.Registry;
 
-public class DisabledXmlLoader implements XmlLoader {
+@Path("/test")
+@ApplicationScoped
+public class CamelServlet {
+    @Inject
+    CamelMain main;
+    @Inject
+    Registry registry;
+    @Inject
+    CamelContext context;
 
-    @Override
-    public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception {
-        throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
+    @Path("/main/describe")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public JsonObject describeMain() {
+        return Json.createObjectBuilder()
+                .add("routes-collector-type", main.getRoutesCollector().getClass().getName())
+                .build();
     }
-
-    @Override
-    public RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception {
-        throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
-    }
-
 }
diff --git a/integration-tests/core-main/src/main/resources/application.properties b/integration-tests/core-main-collector/src/main/resources/application.properties
similarity index 75%
copy from integration-tests/core-main/src/main/resources/application.properties
copy to integration-tests/core-main-collector/src/main/resources/application.properties
index 23a94b0..70c6501 100644
--- a/integration-tests/core-main/src/main/resources/application.properties
+++ b/integration-tests/core-main-collector/src/main/resources/application.properties
@@ -20,29 +20,7 @@
 quarkus.log.file.enable = false
 
 #
-# Quarkus :: Camel
-#
-quarkus.camel.main.routes-discovery.exclude-patterns = org/**/*Filtered
-
-#
 # Camel
 #
 camel.context.name=quarkus-camel-example
 
-#
-# Timer
-#
-camel.component.timer.basic-property-binding = true
-
-#
-# Main
-#
-camel.main.auto-configuration-log-summary = false
-camel.main.xml-routes = file:src/test/resources/my-routes.xml
-
-
-#
-# Other
-#
-the.message = default
-%staging.the.message = test
\ No newline at end of file
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java b/integration-tests/core-main-collector/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
similarity index 53%
rename from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java
rename to integration-tests/core-main-collector/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
index 3b2e4de..a301353 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java
+++ b/integration-tests/core-main-collector/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
@@ -16,22 +16,29 @@
  */
 package org.apache.camel.quarkus.core;
 
-import java.io.InputStream;
+import javax.ws.rs.core.MediaType;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.RestAssured;
+import io.restassured.path.json.JsonPath;
+import org.apache.camel.quarkus.core.runtime.support.SupportRoutesCollector;
+import org.junit.jupiter.api.Test;
 
-public class DisabledXmlLoader implements XmlLoader {
+import static org.assertj.core.api.Assertions.assertThat;
 
-    @Override
-    public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception {
-        throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
-    }
+@QuarkusTest
+public class CamelTest {
+    @Test
+    public void testMainInstanceWithCustomCollector() {
+        JsonPath p = RestAssured.given()
+                .accept(MediaType.APPLICATION_JSON)
+                .get("/test/main/describe")
+                .then()
+                .statusCode(200)
+                .extract()
+                .body()
+                .jsonPath();
 
-    @Override
-    public RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception {
-        throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
+        assertThat(p.getString("routes-collector-type")).isEqualTo(SupportRoutesCollector.class.getName());
     }
-
 }
diff --git a/integration-tests/core-main/pom.xml b/integration-tests/core-main-xml/pom.xml
similarity index 82%
copy from integration-tests/core-main/pom.xml
copy to integration-tests/core-main-xml/pom.xml
index bb0a336..79ee762 100644
--- a/integration-tests/core-main/pom.xml
+++ b/integration-tests/core-main-xml/pom.xml
@@ -25,8 +25,8 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>camel-quarkus-integration-test-core-main</artifactId>
-    <name>Camel Quarkus :: Integration Tests :: Core Main :: Tests</name>
+    <artifactId>camel-quarkus-integration-test-core-main-xml</artifactId>
+    <name>Camel Quarkus :: Integration Tests :: Core Main XML :: Tests</name>
     <description>The camel integration tests</description>
 
     <dependencies>
@@ -36,14 +36,6 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-endpointdsl</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-reactive-executor</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-direct</artifactId>
         </dependency>
         <dependency>
@@ -54,10 +46,6 @@
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-timer</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-integration-test-support-core-main-ext</artifactId>
-        </dependency>
 
         <dependency>
             <groupId>io.quarkus</groupId>
@@ -100,15 +88,6 @@
                     </execution>
                 </executions>
             </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <systemPropertyVariables>
-                        <quarkus.test.profile>staging</quarkus.test.profile>
-                    </systemPropertyVariables>
-                </configuration>
-            </plugin>
         </plugins>
     </build>
 
@@ -134,7 +113,6 @@
                                 <configuration>
                                     <systemProperties>
                                         <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
-                                        <quarkus.test.native-image-profile>staging</quarkus.test.native-image-profile>
                                     </systemProperties>
                                 </configuration>
                             </execution>
diff --git a/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java b/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
new file mode 100644
index 0000000..bab7f56
--- /dev/null
+++ b/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
@@ -0,0 +1,72 @@
+/*
+ * 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.core;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.json.Json;
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonObject;
+import javax.json.JsonObjectBuilder;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.Registry;
+
+@Path("/test")
+@ApplicationScoped
+public class CamelServlet {
+    @Inject
+    CamelMain main;
+    @Inject
+    Registry registry;
+    @Inject
+    CamelContext context;
+
+    @Path("/main/describe")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public JsonObject describeMain() {
+        JsonArrayBuilder listeners = Json.createArrayBuilder();
+        main.getMainListeners().forEach(listener -> listeners.add(listener.getClass().getName()));
+
+        JsonArrayBuilder routeBuilders = Json.createArrayBuilder();
+        main.getRoutesBuilders().forEach(builder -> routeBuilders.add(builder.getClass().getName()));
+
+        JsonArrayBuilder routes = Json.createArrayBuilder();
+        main.getCamelContext().getRoutes().forEach(route -> routes.add(route.getId()));
+
+        JsonObjectBuilder collector = Json.createObjectBuilder();
+        collector.add("type", main.getRoutesCollector().getClass().getName());
+        if (main.getRoutesCollector() instanceof CamelRoutesCollector) {
+            CamelRoutesCollector crc = (CamelRoutesCollector) main.getRoutesCollector();
+            collector.add("type-registry", crc.getRegistryRoutesLoader().getClass().getName());
+            collector.add("type-xml", crc.getXmlRoutesLoader().getClass().getName());
+        }
+
+        return Json.createObjectBuilder()
+                .add("routes-collector", collector)
+                .add("listeners", listeners)
+                .add("routeBuilders", routeBuilders)
+                .add("routes", routes)
+                .add("autoConfigurationLogSummary", main.getMainConfigurationProperties().isAutoConfigurationLogSummary())
+                .build();
+    }
+}
diff --git a/integration-tests/core-main/src/main/resources/application.properties b/integration-tests/core-main-xml/src/main/resources/application.properties
similarity index 80%
copy from integration-tests/core-main/src/main/resources/application.properties
copy to integration-tests/core-main-xml/src/main/resources/application.properties
index 23a94b0..80ead8d 100644
--- a/integration-tests/core-main/src/main/resources/application.properties
+++ b/integration-tests/core-main-xml/src/main/resources/application.properties
@@ -20,29 +20,11 @@
 quarkus.log.file.enable = false
 
 #
-# Quarkus :: Camel
-#
-quarkus.camel.main.routes-discovery.exclude-patterns = org/**/*Filtered
-
-#
 # Camel
 #
 camel.context.name=quarkus-camel-example
 
 #
-# Timer
-#
-camel.component.timer.basic-property-binding = true
-
-#
 # Main
 #
-camel.main.auto-configuration-log-summary = false
 camel.main.xml-routes = file:src/test/resources/my-routes.xml
-
-
-#
-# Other
-#
-the.message = default
-%staging.the.message = test
\ No newline at end of file
diff --git a/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CamelTest.java b/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
new file mode 100644
index 0000000..3d60e95
--- /dev/null
+++ b/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.core;
+
+import javax.ws.rs.core.MediaType;
+
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.RestAssured;
+import io.restassured.path.json.JsonPath;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@QuarkusTest
+public class CamelTest {
+    /*
+     * This test is tagged with quarkus-platform-ignore as it needs to be
+     * ignored when running camel test from the quarkus-platform as the
+     * test relies on a local route file being loaded.
+     */
+    @Test
+    @Tag("quarkus-platform-ignore")
+    public void testMainInstanceWithXmlRoutes() {
+        JsonPath p = RestAssured.given()
+                .accept(MediaType.APPLICATION_JSON)
+                .get("/test/main/describe")
+                .then()
+                .statusCode(200)
+                .extract()
+                .body()
+                .jsonPath();
+
+        assertThat(p.getList("routeBuilders", String.class))
+                .isEmpty();
+        assertThat(p.getList("routes", String.class))
+                .contains("my-xml-route");
+    }
+}
diff --git a/integration-tests/core-main/src/test/resources/my-routes.xml b/integration-tests/core-main-xml/src/test/resources/my-routes.xml
similarity index 100%
rename from integration-tests/core-main/src/test/resources/my-routes.xml
rename to integration-tests/core-main-xml/src/test/resources/my-routes.xml
diff --git a/integration-tests/core-main/pom.xml b/integration-tests/core-main/pom.xml
index bb0a336..6c03c8d 100644
--- a/integration-tests/core-main/pom.xml
+++ b/integration-tests/core-main/pom.xml
@@ -32,10 +32,6 @@
     <dependencies>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-core-xml</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-endpointdsl</artifactId>
         </dependency>
         <dependency>
diff --git a/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java b/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
index 52bc7db..b1081a0 100644
--- a/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
+++ b/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
@@ -113,7 +113,16 @@ public class CamelServlet {
         JsonArrayBuilder routes = Json.createArrayBuilder();
         main.getCamelContext().getRoutes().forEach(route -> routes.add(route.getId()));
 
+        JsonObjectBuilder collector = Json.createObjectBuilder();
+        collector.add("type", main.getRoutesCollector().getClass().getName());
+        if (main.getRoutesCollector() instanceof CamelRoutesCollector) {
+            CamelRoutesCollector crc = (CamelRoutesCollector) main.getRoutesCollector();
+            collector.add("type-registry", crc.getRegistryRoutesLoader().getClass().getName());
+            collector.add("type-xml", crc.getXmlRoutesLoader().getClass().getName());
+        }
+
         return Json.createObjectBuilder()
+                .add("routes-collector", collector)
                 .add("listeners", listeners)
                 .add("routeBuilders", routeBuilders)
                 .add("routes", routes)
diff --git a/integration-tests/core-main/src/main/resources/application.properties b/integration-tests/core-main/src/main/resources/application.properties
index 23a94b0..1cae6b3 100644
--- a/integration-tests/core-main/src/main/resources/application.properties
+++ b/integration-tests/core-main/src/main/resources/application.properties
@@ -38,7 +38,6 @@ camel.component.timer.basic-property-binding = true
 # Main
 #
 camel.main.auto-configuration-log-summary = false
-camel.main.xml-routes = file:src/test/resources/my-routes.xml
 
 
 #
diff --git a/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java b/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
index 0109b68..8248b1c 100644
--- a/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
+++ b/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.quarkus.core;
 
 import java.net.HttpURLConnection;
+
 import javax.ws.rs.core.MediaType;
 
 import io.quarkus.test.junit.QuarkusTest;
@@ -26,7 +27,6 @@ import io.restassured.path.json.JsonPath;
 import io.restassured.response.Response;
 import org.apache.camel.quarkus.core.runtime.support.SupportListener;
 import org.apache.camel.reactive.vertx.VertXReactiveExecutor;
-import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -61,29 +61,6 @@ public class CamelTest {
                 .then().body(is("my-ctx-name"));
     }
 
-    /*
-     * This test is tagged with quarkus-platform-ignore as it needs to be
-     * ignored when running camel test from the quarkus-platform as the
-     * test relies on a local route file being loaded.
-     */
-    @Test
-    @Tag("quarkus-platform-ignore")
-    public void testMainInstanceWithXmlRoutes() {
-        JsonPath p = RestAssured.given()
-                .accept(MediaType.APPLICATION_JSON)
-                .get("/test/main/describe")
-                .then()
-                .statusCode(200)
-                .extract()
-                .body()
-                .jsonPath();
-
-        assertThat(p.getList("routeBuilders", String.class))
-                .contains(SupportListener.MyBuilder.class.getName());
-        assertThat(p.getList("routes", String.class))
-                .contains("my-xml-route");
-    }
-
     @Test
     public void testMainInstance() {
         JsonPath p = RestAssured.given()
@@ -95,6 +72,10 @@ public class CamelTest {
                 .body()
                 .jsonPath();
 
+        assertThat(p.getString("routes-collector.type")).isEqualTo(CamelRoutesCollector.class.getName());
+        assertThat(p.getString("routes-collector.type-registry")).isEqualTo(RegistryRoutesLoaders.Default.class.getName());
+        assertThat(p.getString("routes-collector.type-xml")).isEqualTo(DisabledXmlRoutesLoader.class.getName());
+
         assertThat(p.getList("listeners", String.class))
                 .containsOnly(CamelMainEventDispatcher.class.getName(), SupportListener.class.getName());
         assertThat(p.getList("routeBuilders", String.class))
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index 5fc84e5..4cbf371 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -62,6 +62,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel.quarkus</groupId>
+                <artifactId>camel-quarkus-integration-test-support-core-main-collector-ext</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel.quarkus</groupId>
                 <artifactId>camel-quarkus-integration-test-support</artifactId>
                 <version>${project.version}</version>
             </dependency>
@@ -147,6 +152,8 @@
         <module>support</module>
         <module>core</module>
         <module>core-main</module>
+        <module>core-main-xml</module>
+        <module>core-main-collector</module>
         <module>core-impl</module>
 
         <!-- extensions a..z; do not remove this comment, it is important when sorting via  mvn process-resources -Pformat -->
diff --git a/integration-tests/support/core-main-collector/deployment/pom.xml b/integration-tests/support/core-main-collector/deployment/pom.xml
new file mode 100644
index 0000000..598e7e9
--- /dev/null
+++ b/integration-tests/support/core-main-collector/deployment/pom.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache.camel.quarkus</groupId>
+        <artifactId>camel-quarkus-integration-tests-support-core-main-collector-parent</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>camel-quarkus-integration-test-support-core-main-collector-ext-deployment</artifactId>
+    <name>Camel Quarkus :: Integration Tests :: Support :: Core Main Collector :: Extension :: Deployment</name>
+    <description>A test extension</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.camel.quarkus</groupId>
+                <artifactId>camel-quarkus-bom-deployment</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-core-deployment</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-integration-test-support-core-main-collector-ext</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>io.quarkus</groupId>
+                            <artifactId>quarkus-extension-processor</artifactId>
+                            <version>${quarkus.version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java b/integration-tests/support/core-main-collector/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/Feature.java
similarity index 64%
rename from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java
rename to integration-tests/support/core-main-collector/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/Feature.java
index 09ed32e..82fa65c 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java
+++ b/integration-tests/support/core-main-collector/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/Feature.java
@@ -14,18 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core;
+package org.apache.camel.quarkus.core.runtime.support.deployment;
 
-import java.io.InputStream;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.builditem.FeatureBuildItem;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
-
-public interface XmlLoader {
-
-    RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception;
-
-    RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception;
+public class Feature {
+    private static final String FEATURE = "camel-main-collector-support";
 
+    @BuildStep
+    FeatureBuildItem feature() {
+        return new FeatureBuildItem(FEATURE);
+    }
 }
diff --git a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlLoader.java b/integration-tests/support/core-main-collector/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/SupportBuildStep.java
similarity index 51%
rename from extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlLoader.java
rename to integration-tests/support/core-main-collector/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/SupportBuildStep.java
index 67a329d..2558d38 100644
--- a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlLoader.java
+++ b/integration-tests/support/core-main-collector/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/SupportBuildStep.java
@@ -14,26 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.xml;
+package org.apache.camel.quarkus.core.runtime.support.deployment;
 
-import java.io.InputStream;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import org.apache.camel.quarkus.core.deployment.CamelMainListenerBuildItem;
+import org.apache.camel.quarkus.core.deployment.CamelRoutesCollectorBuildItem;
+import org.apache.camel.quarkus.core.deployment.CamelTypeConverterLoaderBuildItem;
+import org.apache.camel.quarkus.core.runtime.support.SupportRecorder;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.model.ModelHelper;
-import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
-import org.apache.camel.quarkus.core.XmlLoader;
-
-public class DefaultXmlLoader implements XmlLoader {
-
-    @Override
-    public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream is) throws Exception {
-        return ModelHelper.loadRoutesDefinition(context, is);
+public class SupportBuildStep {
+    @Record(ExecutionTime.STATIC_INIT)
+    @BuildStep
+    CamelRoutesCollectorBuildItem listener(SupportRecorder recorder) {
+        return new CamelRoutesCollectorBuildItem(recorder.createSupportCollector());
     }
-
-    @Override
-    public RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception {
-        return ModelHelper.loadRestsDefinition(context, is);
-    }
-
 }
diff --git a/integration-tests/support/pom.xml b/integration-tests/support/core-main-collector/pom.xml
similarity index 69%
copy from integration-tests/support/pom.xml
copy to integration-tests/support/core-main-collector/pom.xml
index 0103cc6..7e09d4e 100644
--- a/integration-tests/support/pom.xml
+++ b/integration-tests/support/core-main-collector/pom.xml
@@ -18,28 +18,22 @@
 
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.camel.quarkus</groupId>
-        <artifactId>camel-quarkus-integration-tests</artifactId>
         <version>1.1.0-SNAPSHOT</version>
+        <artifactId>camel-quarkus-integration-tests-support-parent</artifactId>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>camel-quarkus-integration-tests-support-parent</artifactId>
+    <artifactId>camel-quarkus-integration-tests-support-core-main-collector-parent</artifactId>
     <packaging>pom</packaging>
 
-    <name>Camel Quarkus :: Integration Tests :: Support :: Parent</name>
-    <description>Ancillary modules required by some integration tests. Hosted outside the integration-tests directory
-        so that we can keep a flat hierarchy in the integration-tests directory.
-    </description>
+    <name>Camel Quarkus :: Integration Tests :: Support :: Core Main Collector:: Parent</name>
 
     <modules>
-        <module>test-support</module>
-        <module>testcontainers-support</module>
-        <module>core</module>
-        <module>core-main</module>
+        <module>runtime</module>
+        <module>deployment</module>
     </modules>
 
 </project>
diff --git a/integration-tests/support/core-main-collector/runtime/pom.xml b/integration-tests/support/core-main-collector/runtime/pom.xml
new file mode 100644
index 0000000..cabd394
--- /dev/null
+++ b/integration-tests/support/core-main-collector/runtime/pom.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache.camel.quarkus</groupId>
+        <artifactId>camel-quarkus-integration-tests-support-core-main-collector-parent</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>camel-quarkus-integration-test-support-core-main-collector-ext</artifactId>
+    <name>Camel Quarkus :: Integration Tests :: Support :: Core Main Collector :: Extension :: Runtime</name>
+    <description>A test extension</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.camel.quarkus</groupId>
+                <artifactId>camel-quarkus-bom</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-bootstrap-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>io.quarkus</groupId>
+                            <artifactId>quarkus-extension-processor</artifactId>
+                            <version>${quarkus.version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelXmlLoaderBuildItem.java b/integration-tests/support/core-main-collector/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
similarity index 60%
rename from extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelXmlLoaderBuildItem.java
rename to integration-tests/support/core-main-collector/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
index 06703ec..4122733 100644
--- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelXmlLoaderBuildItem.java
+++ b/integration-tests/support/core-main-collector/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
@@ -14,24 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core.deployment;
+package org.apache.camel.quarkus.core.runtime.support;
 
-import io.quarkus.builder.item.SimpleBuildItem;
 import io.quarkus.runtime.RuntimeValue;
-import org.apache.camel.quarkus.core.XmlLoader;
-import org.apache.camel.spi.ModelJAXBContextFactory;
+import io.quarkus.runtime.annotations.Recorder;
+import org.apache.camel.main.RoutesCollector;
+import org.apache.camel.quarkus.core.CamelRoutesCollector;
 
-/**
- * Holds the {@link ModelJAXBContextFactory} instance.
- */
-public final class CamelXmlLoaderBuildItem extends SimpleBuildItem {
-    private final RuntimeValue<XmlLoader> value;
-
-    public CamelXmlLoaderBuildItem(RuntimeValue<XmlLoader> value) {
-        this.value = value;
-    }
-
-    public RuntimeValue<XmlLoader> getXmlLoader() {
-        return value;
+@Recorder
+public class SupportRecorder {
+    public RuntimeValue<RoutesCollector> createSupportCollector() {
+        return new RuntimeValue<>(new SupportRoutesCollector());
     }
 }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesCollector.java b/integration-tests/support/core-main-collector/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRoutesCollector.java
similarity index 62%
rename from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesCollector.java
rename to integration-tests/support/core-main-collector/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRoutesCollector.java
index 7cd582c..d3ef48e 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesCollector.java
+++ b/integration-tests/support/core-main-collector/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRoutesCollector.java
@@ -14,24 +14,33 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core;
+package org.apache.camel.quarkus.core.runtime.support;
 
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.main.DefaultRoutesCollector;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.main.RoutesCollector;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
 
-public class DisabledXmlRoutesCollector extends DefaultRoutesCollector {
+public class SupportRoutesCollector implements RoutesCollector {
+    @Override
+    public List<RoutesBuilder> collectRoutesFromRegistry(
+            CamelContext camelContext,
+            String excludePattern,
+            String includePattern) {
+        return Collections.emptyList();
+    }
 
     @Override
-    public List<RoutesDefinition> collectXmlRoutesFromDirectory(CamelContext camelContext, String directory) {
-        throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
+    public List<RoutesDefinition> collectXmlRoutesFromDirectory(CamelContext camelContext, String directory) throws Exception {
+        return Collections.emptyList();
     }
 
     @Override
-    public List<RestsDefinition> collectXmlRestsFromDirectory(CamelContext camelContext, String directory) {
-        throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
+    public List<RestsDefinition> collectXmlRestsFromDirectory(CamelContext camelContext, String directory) throws Exception {
+        return Collections.emptyList();
     }
 }
diff --git a/integration-tests/support/pom.xml b/integration-tests/support/pom.xml
index 0103cc6..5d1576b 100644
--- a/integration-tests/support/pom.xml
+++ b/integration-tests/support/pom.xml
@@ -40,6 +40,7 @@
         <module>testcontainers-support</module>
         <module>core</module>
         <module>core-main</module>
+        <module>core-main-collector</module>
     </modules>
 
 </project>