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

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


The following commit(s) were added to refs/heads/main by this push:
     new 63040fa1c94 CAMEL-19917: camel-main/camel-jbang - Add option to ignore 
loading/compilation errors that tooling needs (#11597)
63040fa1c94 is described below

commit 63040fa1c94ffa5b1b6c01eb73ff24bbda4e55ae
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Sep 28 13:20:40 2023 +0200

    CAMEL-19917: camel-main/camel-jbang - Add option to ignore 
loading/compilation errors that tooling needs (#11597)
---
 .../main/camel-main-configuration-metadata.json    |  1 +
 .../java/org/apache/camel/spi/RoutesLoader.java    | 10 ++++
 .../camel/impl/engine/DefaultRoutesLoader.java     | 63 +++++++++++++++++++---
 .../MainConfigurationPropertiesConfigurer.java     |  6 +++
 .../camel-main-configuration-metadata.json         |  1 +
 core/camel-main/src/main/docs/main.adoc            |  3 +-
 .../org/apache/camel/main/BaseMainSupport.java     |  6 ++-
 .../camel/main/DefaultConfigurationProperties.java | 24 +++++++++
 .../apache/camel/main/DefaultRoutesCollector.java  | 18 ++++++-
 .../org/apache/camel/main/RoutesCollector.java     | 10 ++++
 .../org/apache/camel/main/RoutesConfigurer.java    | 30 ++++++++++-
 .../modules/ROOT/pages/camel-jbang.adoc            |  3 ++
 .../camel/dsl/jbang/core/commands/Export.java      |  1 +
 .../dsl/jbang/core/commands/ExportBaseCommand.java |  8 ++-
 .../dsl/jbang/core/commands/ExportCamelMain.java   |  2 +-
 .../dsl/jbang/core/commands/ExportQuarkus.java     |  2 +-
 .../dsl/jbang/core/commands/ExportSpringBoot.java  |  2 +-
 .../apache/camel/dsl/jbang/core/commands/Run.java  | 17 ++++--
 .../camel/dsl/jbang/core/commands/Transform.java   |  2 +-
 .../java/org/apache/camel/main/KameletMain.java    |  5 +-
 .../main/download/CamelCustomClassLoader.java      |  4 +-
 21 files changed, 193 insertions(+), 25 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
index 1ccdccd98d9..237e996e769 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
@@ -94,6 +94,7 @@
     { "name": "camel.main.routesBuilderClasses", "description": "Sets classes 
names that implement RoutesBuilder .", "sourceType": 
"org.apache.camel.main.MainConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
     { "name": "camel.main.routesBuilders", "description": "Sets the 
RoutesBuilder instances.", "sourceType": 
"org.apache.camel.main.MainConfigurationProperties", "type": "object", 
"javaType": "java.util.List" },
     { "name": "camel.main.routesCollectorEnabled", "description": "Whether the 
routes collector is enabled or not. When enabled Camel will auto-discover 
routes (RouteBuilder instances from the registry and also load additional 
routes from the file system). The routes collector is default enabled.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"boolean", "javaType": "boolean", "defaultValue": true },
+    { "name": "camel.main.routesCollectorIgnoreLoadingError", "description": 
"Whether the routes collector should ignore any errors during loading and 
compiling routes. This is only intended for development or tooling.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"boolean", "javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.routesExcludePattern", "description": "Used for 
exclusive filtering of routes from directories. The exclusive filtering takes 
precedence over inclusive filtering. The pattern is using Ant-path style 
pattern. Multiple patterns can be specified separated by comma, as example, to 
exclude all the routes from a directory whose name contains foo use: 
&#42;&#42;\/foo.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType":  [...]
     { "name": "camel.main.routesIncludePattern", "description": "Used for 
inclusive filtering of routes from directories. The exclusive filtering takes 
precedence over inclusive filtering. The pattern is using Ant-path style 
pattern. Multiple patterns can be specified separated by comma, as example, to 
include all the routes from a directory whose name contains foo use: 
&#42;&#42;\/foo.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType":  [...]
     { "name": "camel.main.routesReloadDirectory", "description": "Directory to 
scan for route changes. Camel cannot scan the classpath, so this must be 
configured to a file directory. Development with Maven as build tool, you can 
configure the directory to be src\/main\/resources to scan for Camel routes in 
XML or YAML files.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String", "defaultValue": "src\/main\/resources\/camel" },
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/RoutesLoader.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/RoutesLoader.java
index 0bc6deb2fd5..59694f32742 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/RoutesLoader.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/RoutesLoader.java
@@ -34,6 +34,16 @@ public interface RoutesLoader extends CamelContextAware {
      */
     String FACTORY = "routes-loader";
 
+    /**
+     * Whether to ignore route loading and compilation errors (use this with 
care!)
+     */
+    boolean isIgnoreLoadingError();
+
+    /**
+     * Whether to ignore route loading and compilation errors (use this with 
care!)
+     */
+    void setIgnoreLoadingError(boolean ignoreLoadingError);
+
     /**
      * Looks up a {@link RoutesBuilderLoader} in the registry or fallback to a 
factory finder mechanism if none found.
      *
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
index 37196f50993..71b366cd684 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
@@ -42,12 +42,16 @@ import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.support.service.ServiceSupport;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Default {@link RoutesLoader}.
  */
 public class DefaultRoutesLoader extends ServiceSupport implements 
RoutesLoader, StaticService {
 
+    private static final Logger LOG = 
LoggerFactory.getLogger(DefaultRoutesLoader.class);
+
     /**
      * Prefix to use for looking up existing {@link RoutesLoader} from the 
{@link org.apache.camel.spi.Registry}.
      */
@@ -56,6 +60,7 @@ public class DefaultRoutesLoader extends ServiceSupport 
implements RoutesLoader,
     private final Map<String, RoutesBuilderLoader> loaders;
 
     private CamelContext camelContext;
+    private boolean ignoreLoadingError;
 
     public DefaultRoutesLoader() {
         this(null);
@@ -83,6 +88,14 @@ public class DefaultRoutesLoader extends ServiceSupport 
implements RoutesLoader,
         this.camelContext = camelContext;
     }
 
+    public boolean isIgnoreLoadingError() {
+        return ignoreLoadingError;
+    }
+
+    public void setIgnoreLoadingError(boolean ignoreLoadingError) {
+        this.ignoreLoadingError = ignoreLoadingError;
+    }
+
     @Override
     public Collection<RoutesBuilder> findRoutesBuilders(Collection<Resource> 
resources) throws Exception {
         return findRoutesBuilders(resources, false);
@@ -134,10 +147,27 @@ public class DefaultRoutesLoader extends ServiceSupport 
implements RoutesLoader,
                 // extended loader can load all resources ine one unit
                 ExtendedRoutesBuilderLoader extLoader = 
(ExtendedRoutesBuilderLoader) loader;
                 // pre-parse before loading
-                extLoader.preParseRoutes(entry.getValue());
+                List<Resource> files = entry.getValue();
+                try {
+                    extLoader.preParseRoutes(files);
+                } catch (Exception e) {
+                    if (isIgnoreLoadingError()) {
+                        LOG.warn("Loading resources error: {} due to: {}. This 
exception is ignored.", files, e.getMessage());
+                    } else {
+                        throw e;
+                    }
+                }
             } else {
                 for (Resource resource : entry.getValue()) {
-                    loader.preParseRoute(resource);
+                    try {
+                        loader.preParseRoute(resource);
+                    } catch (Exception e) {
+                        if (isIgnoreLoadingError()) {
+                            LOG.warn("Loading resources error: {} due to: {}. 
This exception is ignored.", resource, e.getMessage());
+                        } else {
+                            throw e;
+                        }
+                    }
                 }
             }
         }
@@ -148,15 +178,32 @@ public class DefaultRoutesLoader extends ServiceSupport 
implements RoutesLoader,
             if (loader instanceof ExtendedRoutesBuilderLoader) {
                 // extended loader can load all resources ine one unit
                 ExtendedRoutesBuilderLoader extLoader = 
(ExtendedRoutesBuilderLoader) loader;
-                Collection<RoutesBuilder> builders = 
extLoader.loadRoutesBuilders(entry.getValue());
-                if (builders != null) {
-                    answer.addAll(builders);
+                List<Resource> files = entry.getValue();
+                try {
+                    Collection<RoutesBuilder> builders = 
extLoader.loadRoutesBuilders(files);
+                    if (builders != null) {
+                        answer.addAll(builders);
+                    }
+                } catch (Exception e) {
+                    if (isIgnoreLoadingError()) {
+                        LOG.warn("Loading resources error: {} due to: {}. This 
exception is ignored.", files, e.getMessage());
+                    } else {
+                        throw e;
+                    }
                 }
             } else {
                 for (Resource resource : entry.getValue()) {
-                    RoutesBuilder builder = loader.loadRoutesBuilder(resource);
-                    if (builder != null) {
-                        answer.add(builder);
+                    try {
+                        RoutesBuilder builder = 
loader.loadRoutesBuilder(resource);
+                        if (builder != null) {
+                            answer.add(builder);
+                        }
+                    } catch (Exception e) {
+                        if (isIgnoreLoadingError()) {
+                            LOG.warn("Loading resources error: {} due to: {}. 
This exception is ignored.", resource, e.getMessage());
+                        } else {
+                            throw e;
+                        }
                     }
                 }
             }
diff --git 
a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
 
b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
index c8a783e0e9e..776094acb67 100644
--- 
a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
+++ 
b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
@@ -183,6 +183,8 @@ public class MainConfigurationPropertiesConfigurer extends 
org.apache.camel.supp
         case "RoutesBuilders": target.setRoutesBuilders(property(camelContext, 
java.util.List.class, value)); return true;
         case "routescollectorenabled":
         case "RoutesCollectorEnabled": 
target.setRoutesCollectorEnabled(property(camelContext, boolean.class, value)); 
return true;
+        case "routescollectorignoreloadingerror":
+        case "RoutesCollectorIgnoreLoadingError": 
target.setRoutesCollectorIgnoreLoadingError(property(camelContext, 
boolean.class, value)); return true;
         case "routesexcludepattern":
         case "RoutesExcludePattern": 
target.setRoutesExcludePattern(property(camelContext, java.lang.String.class, 
value)); return true;
         case "routesincludepattern":
@@ -442,6 +444,8 @@ public class MainConfigurationPropertiesConfigurer extends 
org.apache.camel.supp
         case "RoutesBuilders": return java.util.List.class;
         case "routescollectorenabled":
         case "RoutesCollectorEnabled": return boolean.class;
+        case "routescollectorignoreloadingerror":
+        case "RoutesCollectorIgnoreLoadingError": return boolean.class;
         case "routesexcludepattern":
         case "RoutesExcludePattern": return java.lang.String.class;
         case "routesincludepattern":
@@ -702,6 +706,8 @@ public class MainConfigurationPropertiesConfigurer extends 
org.apache.camel.supp
         case "RoutesBuilders": return target.getRoutesBuilders();
         case "routescollectorenabled":
         case "RoutesCollectorEnabled": return 
target.isRoutesCollectorEnabled();
+        case "routescollectorignoreloadingerror":
+        case "RoutesCollectorIgnoreLoadingError": return 
target.isRoutesCollectorIgnoreLoadingError();
         case "routesexcludepattern":
         case "RoutesExcludePattern": return target.getRoutesExcludePattern();
         case "routesincludepattern":
diff --git 
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
 
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index 1ccdccd98d9..237e996e769 100644
--- 
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ 
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -94,6 +94,7 @@
     { "name": "camel.main.routesBuilderClasses", "description": "Sets classes 
names that implement RoutesBuilder .", "sourceType": 
"org.apache.camel.main.MainConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
     { "name": "camel.main.routesBuilders", "description": "Sets the 
RoutesBuilder instances.", "sourceType": 
"org.apache.camel.main.MainConfigurationProperties", "type": "object", 
"javaType": "java.util.List" },
     { "name": "camel.main.routesCollectorEnabled", "description": "Whether the 
routes collector is enabled or not. When enabled Camel will auto-discover 
routes (RouteBuilder instances from the registry and also load additional 
routes from the file system). The routes collector is default enabled.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"boolean", "javaType": "boolean", "defaultValue": true },
+    { "name": "camel.main.routesCollectorIgnoreLoadingError", "description": 
"Whether the routes collector should ignore any errors during loading and 
compiling routes. This is only intended for development or tooling.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"boolean", "javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.routesExcludePattern", "description": "Used for 
exclusive filtering of routes from directories. The exclusive filtering takes 
precedence over inclusive filtering. The pattern is using Ant-path style 
pattern. Multiple patterns can be specified separated by comma, as example, to 
exclude all the routes from a directory whose name contains foo use: 
&#42;&#42;\/foo.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType":  [...]
     { "name": "camel.main.routesIncludePattern", "description": "Used for 
inclusive filtering of routes from directories. The exclusive filtering takes 
precedence over inclusive filtering. The pattern is using Ant-path style 
pattern. Multiple patterns can be specified separated by comma, as example, to 
include all the routes from a directory whose name contains foo use: 
&#42;&#42;\/foo.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType":  [...]
     { "name": "camel.main.routesReloadDirectory", "description": "Directory to 
scan for route changes. Camel cannot scan the classpath, so this must be 
configured to a file directory. Development with Maven as build tool, you can 
configure the directory to be src\/main\/resources to scan for Camel routes in 
XML or YAML files.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String", "defaultValue": "src\/main\/resources\/camel" },
diff --git a/core/camel-main/src/main/docs/main.adoc 
b/core/camel-main/src/main/docs/main.adoc
index 0020c4572ac..aefdf771bcb 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -19,7 +19,7 @@ The following tables lists all the options:
 
 // main options: START
 === Camel Main configurations
-The camel.main supports 126 options, which are listed below.
+The camel.main supports 127 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -105,6 +105,7 @@ The camel.main supports 126 options, which are listed below.
 | *camel.main.routesBuilder{zwsp}Classes* | Sets classes names that implement 
RoutesBuilder . |  | String
 | *camel.main.routesBuilders* | Sets the RoutesBuilder instances. |  | List
 | *camel.main.routesCollector{zwsp}Enabled* | Whether the routes collector is 
enabled or not. When enabled Camel will auto-discover routes (RouteBuilder 
instances from the registry and also load additional routes from the file 
system). The routes collector is default enabled. | true | boolean
+| *camel.main.routesCollector{zwsp}IgnoreLoadingError* | Whether the routes 
collector should ignore any errors during loading and compiling routes. This is 
only intended for development or tooling. | false | boolean
 | *camel.main.routesExclude{zwsp}Pattern* | Used for exclusive filtering of 
routes from directories. The exclusive filtering takes precedence over 
inclusive filtering. The pattern is using Ant-path style pattern. Multiple 
patterns can be specified separated by comma, as example, to exclude all the 
routes from a directory whose name contains foo use: &#42;&#42;/foo. |  | String
 | *camel.main.routesInclude{zwsp}Pattern* | Used for inclusive filtering of 
routes from directories. The exclusive filtering takes precedence over 
inclusive filtering. The pattern is using Ant-path style pattern. Multiple 
patterns can be specified separated by comma, as example, to include all the 
routes from a directory whose name contains foo use: &#42;&#42;/foo. | 
classpath:camel/*,classpath:camel-template/*,classpath:camel-rest/* | String
 | *camel.main.routesReload{zwsp}Directory* | Directory to scan for route 
changes. Camel cannot scan the classpath, so this must be configured to a file 
directory. Development with Maven as build tool, you can configure the 
directory to be src/main/resources to scan for Camel routes in XML or YAML 
files. | src/main/resources/camel | String
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java 
b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
index fa1f087dee3..b2906c2bda9 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
@@ -549,7 +549,9 @@ public abstract class BaseMainSupport extends BaseService {
 
     protected void configureRoutesLoader(CamelContext camelContext) {
         // use main based routes loader
-        
camelContext.getCamelContextExtension().addContextPlugin(RoutesLoader.class, 
new DefaultRoutesLoader());
+        RoutesLoader loader = new DefaultRoutesLoader();
+        
loader.setIgnoreLoadingError(mainConfigurationProperties.isRoutesCollectorIgnoreLoadingError());
+        
camelContext.getCamelContextExtension().addContextPlugin(RoutesLoader.class, 
loader);
     }
 
     protected void modelineRoutes(CamelContext camelContext) throws Exception {
@@ -569,8 +571,10 @@ public abstract class BaseMainSupport extends BaseService {
         // then configure and add the routes
         RoutesConfigurer configurer = new RoutesConfigurer();
 
+        
routesCollector.setIgnoreLoadingError(mainConfigurationProperties.isRoutesCollectorIgnoreLoadingError());
         if (mainConfigurationProperties.isRoutesCollectorEnabled()) {
             configurer.setRoutesCollector(routesCollector);
+            
configurer.setIgnoreLoadingError(mainConfigurationProperties.isRoutesCollectorIgnoreLoadingError());
         }
 
         
configurer.setBeanPostProcessor(PluginHelper.getBeanPostProcessor(camelContext));
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
index 9ef65ba9ce4..83af6a7d6e1 100644
--- 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
+++ 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
@@ -112,6 +112,7 @@ public abstract class DefaultConfigurationProperties<T> {
     private LoggingLevel beanIntrospectionLoggingLevel;
     private boolean contextReloadEnabled;
     private boolean routesCollectorEnabled = true;
+    private boolean routesCollectorIgnoreLoadingError;
     private String javaRoutesIncludePattern;
     private String javaRoutesExcludePattern;
     private String routesIncludePattern = 
"classpath:camel/*,classpath:camel-template/*,classpath:camel-rest/*";
@@ -1166,6 +1167,19 @@ public abstract class DefaultConfigurationProperties<T> {
         this.routesCollectorEnabled = routesCollectorEnabled;
     }
 
+    public boolean isRoutesCollectorIgnoreLoadingError() {
+        return routesCollectorIgnoreLoadingError;
+    }
+
+    /**
+     * Whether the routes collector should ignore any errors during loading 
and compiling routes.
+     *
+     * This is only intended for development or tooling.
+     */
+    public void setRoutesCollectorIgnoreLoadingError(boolean 
routesCollectorIgnoreLoadingError) {
+        this.routesCollectorIgnoreLoadingError = 
routesCollectorIgnoreLoadingError;
+    }
+
     public String getJavaRoutesIncludePattern() {
         return javaRoutesIncludePattern;
     }
@@ -2482,6 +2496,16 @@ public abstract class DefaultConfigurationProperties<T> {
         return (T) this;
     }
 
+    /**
+     * Whether the routes collector should ignore any errors during loading 
and compiling routes.
+     *
+     * This is only intended for development or tooling.
+     */
+    public T withRoutesCollectorIgnoreLoadingError(boolean 
routesCollectorIgnoreLoadingError) {
+        this.routesCollectorIgnoreLoadingError = 
routesCollectorIgnoreLoadingError;
+        return (T) this;
+    }
+
     /**
      * Used for inclusive filtering component scanning of RouteBuilder classes 
with @Component annotation. The exclusive
      * filtering takes precedence over inclusive filtering. The pattern is 
using Ant-path style pattern.
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultRoutesCollector.java
 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultRoutesCollector.java
index ffefd06891b..7df07acd9a5 100644
--- 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultRoutesCollector.java
+++ 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultRoutesCollector.java
@@ -44,6 +44,18 @@ public class DefaultRoutesCollector implements 
RoutesCollector {
 
     protected final Logger log = LoggerFactory.getLogger(getClass());
 
+    private boolean ignoreLoadingError;
+
+    @Override
+    public boolean isIgnoreLoadingError() {
+        return ignoreLoadingError;
+    }
+
+    @Override
+    public void setIgnoreLoadingError(boolean ignoreLoadingError) {
+        this.ignoreLoadingError = ignoreLoadingError;
+    }
+
     @Override
     public Collection<RoutesBuilder> collectRoutesFromRegistry(
             CamelContext camelContext,
@@ -194,7 +206,11 @@ public class DefaultRoutesCollector implements 
RoutesCollector {
                 builders.addAll(found);
             }
         } catch (Exception e) {
-            throw RuntimeCamelException.wrapRuntimeException(e);
+            if (isIgnoreLoadingError()) {
+                log.warn("Loading resources error: {} due to: {}. This 
exception is ignored.", accepted, e.getMessage());
+            } else {
+                throw RuntimeCamelException.wrapRuntimeException(e);
+            }
         }
     }
 
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/RoutesCollector.java 
b/core/camel-main/src/main/java/org/apache/camel/main/RoutesCollector.java
index e7954d6610e..43abbd26a43 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/RoutesCollector.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/RoutesCollector.java
@@ -28,6 +28,16 @@ import org.apache.camel.spi.Resource;
  */
 public interface RoutesCollector {
 
+    /**
+     * Whether to ignore route loading and compilation errors (use this with 
care!)
+     */
+    boolean isIgnoreLoadingError();
+
+    /**
+     * Whether to ignore route loading and compilation errors (use this with 
care!)
+     */
+    void setIgnoreLoadingError(boolean ignoreLoadingError);
+
     /**
      * Collects the {@link RoutesBuilder} instances which was discovered from 
the {@link org.apache.camel.spi.Registry}
      * such as Spring or CDI bean containers.
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java 
b/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
index c7ec97675fa..4038a4539c2 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
@@ -50,6 +50,7 @@ public class RoutesConfigurer {
     private static final Logger LOG = 
LoggerFactory.getLogger(RoutesConfigurer.class);
 
     private RoutesCollector routesCollector;
+    private boolean ignoreLoadingError;
     private CamelBeanPostProcessor beanPostProcessor;
     private List<RoutesBuilder> routesBuilders;
     private String basePackageScan;
@@ -60,6 +61,14 @@ public class RoutesConfigurer {
     private String routesIncludePattern;
     private String routesSourceDir;
 
+    public boolean isIgnoreLoadingError() {
+        return ignoreLoadingError;
+    }
+
+    public void setIgnoreLoadingError(boolean ignoreLoadingError) {
+        this.ignoreLoadingError = ignoreLoadingError;
+    }
+
     public List<RoutesBuilder> getRoutesBuilders() {
         return routesBuilders;
     }
@@ -349,10 +358,27 @@ public class RoutesConfigurer {
             if (loader instanceof ExtendedRoutesBuilderLoader) {
                 // extended loader can pre-parse all resources ine one unit
                 ExtendedRoutesBuilderLoader extLoader = 
(ExtendedRoutesBuilderLoader) loader;
-                extLoader.preParseRoutes(entry.getValue());
+                List<Resource> files = entry.getValue();
+                try {
+                    extLoader.preParseRoutes(files);
+                } catch (Exception e) {
+                    if (ignoreLoadingError) {
+                        LOG.warn("Loading resources error: {} due to: {}. This 
exception is ignored.", files, e.getMessage());
+                    } else {
+                        throw e;
+                    }
+                }
             } else {
                 for (Resource resource : entry.getValue()) {
-                    loader.preParseRoute(resource);
+                    try {
+                        loader.preParseRoute(resource);
+                    } catch (Exception e) {
+                        if (ignoreLoadingError) {
+                            LOG.warn("Loading resources error: {} due to: {}. 
This exception is ignored.", resource, e.getMessage());
+                        } else {
+                            throw e;
+                        }
+                    }
                 }
             }
         }
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index 5e443c1d070..8d50b3b52b0 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -2469,6 +2469,9 @@ The follow options related to _exporting_, can be 
configured in `application.pro
 |`camel.jbang.health`
 | Health check at /q/health on local HTTP server (port 8080 by default) when 
running standalone Camel
 
+|`camel.jbang.ignoreLoadingError`
+| Whether to ignore route loading and compilation errors (use this with care!)
+
 |===
 
 NOTE: These are options from the export command, so you can see mor details 
and default values using `camel export --help`.
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
index 4a7fff68bb9..777863106dd 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
@@ -122,6 +122,7 @@ public class Export extends ExportBaseCommand {
         cmd.openapi = this.openapi;
         cmd.packageName = this.packageName;
         cmd.exclude = this.exclude;
+        cmd.ignoreLoadingError = this.ignoreLoadingError;
         // run export
         return cmd.export();
     }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
index 262a6952df5..26192f1d5cb 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
@@ -192,6 +192,10 @@ abstract class ExportBaseCommand extends CamelCommand {
                         description = "Will be quiet, only print when error 
occurs")
     boolean quiet;
 
+    @CommandLine.Option(names = { "--ignore-loading-error" },
+                        description = "Whether to ignore route loading and 
compilation errors (use this with care!)")
+    protected boolean ignoreLoadingError;
+
     public ExportBaseCommand(CamelJBangMain main) {
         super(main);
     }
@@ -264,7 +268,7 @@ abstract class ExportBaseCommand extends CamelCommand {
         return null;
     }
 
-    protected Integer runSilently() throws Exception {
+    protected Integer runSilently(boolean ignoreLoadingError) throws Exception 
{
         Run run = new Run(getMain());
         // need to declare the profile to use for run
         run.profile = profile;
@@ -273,7 +277,7 @@ abstract class ExportBaseCommand extends CamelCommand {
         run.files = files;
         run.exclude = exclude;
         run.openapi = openapi;
-        return run.runSilent();
+        return run.runSilent(ignoreLoadingError);
     }
 
     protected Set<String> resolveDependencies(File settings, File profile) 
throws Exception {
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
index ba4357fc84e..f081c8d90d6 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
@@ -63,7 +63,7 @@ class ExportCamelMain extends Export {
             if (!quiet && fresh) {
                 System.out.println("Generating fresh run data");
             }
-            int silent = runSilently();
+            int silent = runSilently(ignoreLoadingError);
             if (silent != 0) {
                 return silent;
             }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
index a521dbd6467..0b3bcd0db5b 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
@@ -66,7 +66,7 @@ class ExportQuarkus extends Export {
             if (!quiet) {
                 System.out.println("Generating fresh run data");
             }
-            int silent = runSilently();
+            int silent = runSilently(ignoreLoadingError);
             if (silent != 0) {
                 return silent;
             }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
index 8f73f2182c7..8972f206aa4 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
@@ -67,7 +67,7 @@ class ExportSpringBoot extends Export {
             if (!quiet) {
                 System.out.println("Generating fresh run data");
             }
-            int silent = runSilently();
+            int silent = runSilently(ignoreLoadingError);
             if (silent != 0) {
                 return silent;
             }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
index 9805aa5bcf6..306610aed4d 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
@@ -251,6 +251,10 @@ public class Run extends CamelCommand {
     @Option(names = { "--verbose" }, description = "Verbose output of startup 
activity (dependency resolution and downloading")
     boolean verbose;
 
+    @Option(names = { "--ignore-loading-error" },
+            description = "Whether to ignore route loading and compilation 
errors (use this with care!)")
+    protected boolean ignoreLoadingError;
+
     public Run(CamelJBangMain main) {
         super(main);
     }
@@ -274,14 +278,19 @@ public class Run extends CamelCommand {
     }
 
     protected Integer runSilent() throws Exception {
+        return runSilent(false);
+    }
+
+    protected Integer runSilent(boolean ignoreLoadingError) throws Exception {
         // just boot silently and exit
-        silentRun = true;
+        this.silentRun = true;
+        this.ignoreLoadingError = ignoreLoadingError;
         return run();
     }
 
     protected Integer runTransform() throws Exception {
         // just boot silently and exit
-        transformRun = true;
+        this.transformRun = true;
         return run();
     }
 
@@ -422,6 +431,9 @@ public class Run extends CamelCommand {
         if (modeline) {
             writeSetting(main, profileProperties, "camel.main.modeline", 
"true");
         }
+        if (ignoreLoadingError) {
+            writeSetting(main, profileProperties, 
"camel.jbang.ignoreLoadingError", "true");
+        }
 
         if (gav != null) {
             writeSetting(main, profileProperties, "camel.jbang.gav", gav);
@@ -472,7 +484,6 @@ public class Run extends CamelCommand {
             // do not run for very long in silent run
             main.addInitialProperty("camel.main.autoStartup", "false");
             main.addInitialProperty("camel.main.durationMaxSeconds", "1");
-            main.addInitialProperty("camel.main.durationMaxSeconds", "1");
         } else if (scriptRun) {
             // auto terminate if being idle
             main.addInitialProperty("camel.main.durationMaxIdleSeconds", "1");
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Transform.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Transform.java
index ac6a79c8528..310dd31fd61 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Transform.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Transform.java
@@ -82,7 +82,7 @@ public class Transform extends CamelCommand {
         };
         run.files = files;
         run.maxSeconds = 1;
-        Integer exit = run.runSilent();
+        Integer exit = run.runTransform();
         if (exit != null && exit != 0) {
             return exit;
         }
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
index 39a4793b899..7c8d684e7d4 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
@@ -447,12 +447,15 @@ public class KameletMain extends MainCommandLineSupport {
         if (tracing) {
             configure().withBacklogTracing(true);
         }
-
         boolean health = 
"true".equals(getInitialProperties().get("camel.jbang.health"));
         if (health) {
             configure().httpServer().withEnabled(true);
             configure().httpServer().withHealthCheckEnabled(true);
         }
+        boolean ignoreLoading = 
"true".equals(getInitialProperties().get("camel.jbang.ignoreLoadingError"));
+        if (ignoreLoading) {
+            configure().withRoutesCollectorIgnoreLoadingError(true);
+        }
         if (silent) {
             // silent should not include http server
             configure().httpServer().withEnabled(false);
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/CamelCustomClassLoader.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/CamelCustomClassLoader.java
index 5018b9818b3..c69e5c64fd2 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/CamelCustomClassLoader.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/CamelCustomClassLoader.java
@@ -19,8 +19,8 @@ package org.apache.camel.main.download;
 import org.apache.camel.CamelContext;
 
 /**
- * ClassLoader loading from any custom class loaders that may
- * have been added to Camel {@link org.apache.camel.spi.ClassResolver}.
+ * ClassLoader loading from any custom class loaders that may have been added 
to Camel
+ * {@link org.apache.camel.spi.ClassResolver}.
  */
 public class CamelCustomClassLoader extends ClassLoader {
 


Reply via email to