You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/09/01 10:15:32 UTC

[camel] branch jbang401 created (now 51c284c5838)

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

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


      at 51c284c5838 CAMEL-19798: Consistently set camel-kamelets version in Camel JBang

This branch includes the following new commits:

     new 51c284c5838 CAMEL-19798: Consistently set camel-kamelets version in Camel JBang

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[camel] 01/01: CAMEL-19798: Consistently set camel-kamelets version in Camel JBang

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 51c284c583898b72fdb36249578ebf3fb81a4945
Author: Christoph Deppisch <cd...@redhat.com>
AuthorDate: Tue Aug 29 15:52:58 2023 +0200

    CAMEL-19798: Consistently set camel-kamelets version in Camel JBang
    
    - Avoids inconsistent versions on camel-kamelets dependencies (e.g. camel-kamelets-utils library)
    - Make sure to use same version for camel-kamelets and camel-kamelets-utils dependency
    - Add --kamelets-version setting on Camel JBang run command
    - Propagate camel-kamelets version to KameletMain as initial property and use this version in Kamelet dependency downloader
    - Fallback to deriving the camel-kamelets version from classpath only if version has not been set
    - Support camel-kamelets: prefix when referencing dependencies in Kamelets and Pipe/KameletBinding resources and resolve with proper camel-kamelets version
---
 .../dsl/jbang/core/commands/ExportBaseCommand.java |  7 +++-
 .../apache/camel/dsl/jbang/core/commands/Init.java |  6 ++-
 .../apache/camel/dsl/jbang/core/commands/Run.java  | 21 ++++++++++
 .../core/commands/catalog/CatalogKamelet.java      |  7 +++-
 .../camel/dsl/jbang/core/common/VersionHelper.java |  3 ++
 .../templates/run-custom-camel-version.tmpl        |  2 +-
 .../java/org/apache/camel/main/KameletMain.java    | 18 +++++++-
 .../main/download/DependencyDownloaderKamelet.java | 44 ++++++++------------
 .../download/DependencyDownloaderRoutesLoader.java |  8 +++-
 .../download/KnownKameletRoutesBuilderLoader.java  | 48 +++++++++++-----------
 .../org/apache/camel/main/util/VersionHelper.java  | 25 +++++++++++
 11 files changed, 131 insertions(+), 58 deletions(-)

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 89d024e23fe..c8054a0c2b3 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
@@ -47,6 +47,7 @@ import java.util.stream.Collectors;
 import org.apache.camel.catalog.DefaultCamelCatalog;
 import org.apache.camel.dsl.jbang.core.common.RuntimeCompletionCandidates;
 import org.apache.camel.dsl.jbang.core.common.RuntimeUtil;
+import org.apache.camel.dsl.jbang.core.common.VersionHelper;
 import org.apache.camel.tooling.maven.MavenGav;
 import org.apache.camel.util.CamelCaseOrderedProperties;
 import org.apache.camel.util.FileUtil;
@@ -108,7 +109,7 @@ abstract class ExportBaseCommand extends CamelCommand {
     protected String camelVersion;
 
     @CommandLine.Option(names = {
-            "--kamelets-version" }, description = "Apache Camel Kamelets version", defaultValue = "4.0.0-RC1")
+            "--kamelets-version" }, description = "Apache Camel Kamelets version")
     protected String kameletsVersion;
 
     @CommandLine.Option(names = { "--local-kamelet-dir" },
@@ -281,6 +282,10 @@ abstract class ExportBaseCommand extends CamelCommand {
             return o1.compareTo(o2);
         });
 
+        if (kameletsVersion == null) {
+            kameletsVersion = VersionHelper.extractKameletsVersion();
+        }
+
         // custom dependencies
         if (dependencies != null) {
             for (String d : dependencies.split(",")) {
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Init.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Init.java
index 75f46f30290..2264980c80c 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Init.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Init.java
@@ -26,6 +26,7 @@ import java.util.StringJoiner;
 import org.apache.camel.CamelContext;
 import org.apache.camel.dsl.jbang.core.commands.catalog.KameletCatalogHelper;
 import org.apache.camel.dsl.jbang.core.common.ResourceDoesNotExist;
+import org.apache.camel.dsl.jbang.core.common.VersionHelper;
 import org.apache.camel.github.GistResourceResolver;
 import org.apache.camel.github.GitHubResourceResolver;
 import org.apache.camel.impl.DefaultCamelContext;
@@ -60,7 +61,7 @@ public class Init extends CamelCommand {
     private String fromKamelet;
 
     @Option(names = {
-            "--kamelets-version" }, description = "Apache Camel Kamelets version", defaultValue = "4.0.0-RC1")
+            "--kamelets-version" }, description = "Apache Camel Kamelets version")
     private String kameletsVersion;
 
     @Option(names = { "--integration" },
@@ -95,6 +96,9 @@ public class Init extends CamelCommand {
         InputStream is = null;
         if ("kamelet.yaml".equals(ext)) {
             if (fromKamelet != null) {
+                if (kameletsVersion == null) {
+                    kameletsVersion = VersionHelper.extractKameletsVersion();
+                }
                 // load existing kamelet
                 is = KameletCatalogHelper.loadKameletYamlSchema(fromKamelet, kameletsVersion);
             } else if (file.contains("source")) {
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 6e56380f37b..cda6ac22697 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
@@ -129,6 +129,9 @@ public class Run extends CamelCommand {
     @Option(names = { "--camel-version" }, description = "To run using a different Camel version than the default version.")
     String camelVersion;
 
+    @Option(names = { "--kamelets-version" }, description = "Apache Camel Kamelets version")
+    String kameletsVersion;
+
     @Option(names = { "--profile" }, scope = CommandLine.ScopeType.INHERIT, defaultValue = "application",
             description = "Profile to use, which refers to loading properties file with the given profile name. By default application.properties is loaded.")
     String profile;
@@ -439,6 +442,8 @@ public class Run extends CamelCommand {
         writeSetting(main, profileProperties, "camel.jbang.jfr", jfr || jfrProfile != null ? "jfr" : null); // TODO: "true" instead of "jfr" ?
         writeSetting(main, profileProperties, "camel.jbang.jfr-profile", jfrProfile != null ? jfrProfile : null);
 
+        writeSetting(main, profileProperties, "camel.jbang.kameletsVersion", kameletsVersion);
+
         StringJoiner js = new StringJoiner(",");
         StringJoiner sjReload = new StringJoiner(",");
         StringJoiner sjClasspathFiles = new StringJoiner(",");
@@ -703,8 +708,13 @@ public class Run extends CamelCommand {
             background = "true".equals(answer.getProperty("camel.jbang.background", background ? "true" : "false"));
             jvmDebug = "true".equals(answer.getProperty("camel.jbang.jvmDebug", jvmDebug ? "true" : "false"));
             camelVersion = answer.getProperty("camel.jbang.camel-version", camelVersion);
+            kameletsVersion = answer.getProperty("camel.jbang.kameletsVersion", kameletsVersion);
             gav = answer.getProperty("camel.jbang.gav", gav);
         }
+
+        if (kameletsVersion == null) {
+            kameletsVersion = VersionHelper.extractKameletsVersion();
+        }
         return answer;
     }
 
@@ -718,6 +728,9 @@ public class Run extends CamelCommand {
         if (camelVersion != null) {
             cmds.remove("--camel-version=" + camelVersion);
         }
+        if (kameletsVersion != null) {
+            cmds.remove("--kamelets-version=" + kameletsVersion);
+        }
         // need to use jbang command to specify camel version
         List<String> jbangArgs = new ArrayList<>();
         jbangArgs.add("jbang");
@@ -725,6 +738,9 @@ public class Run extends CamelCommand {
         if (camelVersion != null) {
             jbangArgs.add("-Dcamel.jbang.version=" + camelVersion);
         }
+        if (kameletsVersion != null) {
+            jbangArgs.add("-Dcamel-kamelets.version=" + kameletsVersion);
+        }
         if (jvmDebug) {
             jbangArgs.add("--debug"); // jbang --debug
             cmds.remove("--jvm-debug");
@@ -799,6 +815,10 @@ public class Run extends CamelCommand {
         }
         content = content.replaceFirst("\\{\\{ \\.CamelJBangDependencies }}", sb.toString());
 
+        sb = new StringBuilder();
+        sb.append(String.format("//DEPS org.apache.camel.kamelets:camel-kamelets:%s\n", kameletsVersion));
+        content = content.replaceFirst("\\{\\{ \\.CamelKameletsDependencies }}", sb.toString());
+
         String fn = WORK_DIR + "/CustomCamelJBang.java";
         Files.write(Paths.get(fn), content.getBytes(StandardCharsets.UTF_8));
 
@@ -816,6 +836,7 @@ public class Run extends CamelCommand {
         }
 
         cmds.remove("--camel-version=" + camelVersion);
+        cmds.remove("--kamelets-version=" + kameletsVersion);
         // need to use jbang command to specify camel version
         List<String> jbangArgs = new ArrayList<>();
         jbangArgs.add("jbang");
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
index e9ab75b38e1..2a80520a5e6 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
@@ -29,6 +29,7 @@ import com.github.freva.asciitable.Column;
 import com.github.freva.asciitable.HorizontalAlign;
 import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.jbang.core.common.VersionHelper;
 import org.apache.camel.main.download.DependencyDownloaderClassLoader;
 import org.apache.camel.main.download.MavenDependencyDownloader;
 import org.apache.camel.support.ObjectHelper;
@@ -52,7 +53,7 @@ public class CatalogKamelet extends CamelCommand {
     String filterName;
 
     @CommandLine.Option(names = {
-            "--kamelets-version" }, description = "Apache Camel Kamelets version", defaultValue = "4.0.0-RC1")
+            "--kamelets-version" }, description = "Apache Camel Kamelets version")
     String kameletsVersion;
 
     public CatalogKamelet(CamelJBangMain main) {
@@ -63,6 +64,10 @@ public class CatalogKamelet extends CamelCommand {
     public Integer doCall() throws Exception {
         List<KameletModel> rows = new ArrayList<>();
 
+        if (kameletsVersion == null) {
+            kameletsVersion = VersionHelper.extractKameletsVersion();
+        }
+
         Map<String, Object> kamelets;
         try {
             ClassLoader cl = createClassLoader();
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java
index b2362cc445d..b5024359174 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java
@@ -111,4 +111,7 @@ public final class VersionHelper {
         return s.compareTo(t);
     }
 
+    public static String extractKameletsVersion() {
+        return org.apache.camel.main.util.VersionHelper.extractKameletsVersion();
+    }
 }
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/run-custom-camel-version.tmpl b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/run-custom-camel-version.tmpl
index c707abfb58c..e8843fa8509 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/run-custom-camel-version.tmpl
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/run-custom-camel-version.tmpl
@@ -22,7 +22,7 @@
 //REPOS central=https://repo1.maven.org/maven2,apache-snapshot=http://repository.apache.org/content/groups/snapshots/
 {{ .CamelDependencies }}
 {{ .CamelJBangDependencies }}
-//DEPS org.apache.camel.kamelets:camel-kamelets:${camel-kamelets.version:4.0.0-RC1}
+{{ .CamelKameletsDependencies }}
 
 package main;
 
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 a6c4580f7d9..b16680ea7ec 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
@@ -518,7 +518,12 @@ public class KameletMain extends MainCommandLineSupport {
             }
             answer.setInjector(new KameletMainInjector(answer.getInjector(), stub));
             if (download) {
-                answer.addService(new DependencyDownloaderKamelet(answer));
+                Object kameletsVersion = getInitialProperties().get("camel.jbang.kameletsVersion");
+                if (kameletsVersion != null) {
+                    answer.addService(new DependencyDownloaderKamelet(answer, kameletsVersion.toString()));
+                } else {
+                    answer.addService(new DependencyDownloaderKamelet(answer));
+                }
                 answer.getCamelContextExtension().getRegistry().bind(DownloadModelineParser.class.getSimpleName(),
                         new DownloadModelineParser(answer));
             }
@@ -607,9 +612,18 @@ public class KameletMain extends MainCommandLineSupport {
     @Override
     protected void configureRoutesLoader(CamelContext camelContext) {
         if (download) {
+            DependencyDownloaderRoutesLoader routesLoader;
+
+            Object kameletsVersion = getInitialProperties().get("camel.jbang.kameletsVersion");
+            if (kameletsVersion != null) {
+                routesLoader = new DependencyDownloaderRoutesLoader(camelContext, kameletsVersion.toString());
+            } else {
+                routesLoader = new DependencyDownloaderRoutesLoader(camelContext);
+            }
+
             // use resolvers that can auto downloaded
             camelContext.getCamelContextExtension()
-                    .addContextPlugin(RoutesLoader.class, new DependencyDownloaderRoutesLoader(camelContext));
+                    .addContextPlugin(RoutesLoader.class, routesLoader);
         } else {
             super.configureRoutesLoader(camelContext);
         }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderKamelet.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderKamelet.java
index 919daa13914..3955166ed44 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderKamelet.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderKamelet.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.main.download;
 
-import java.lang.management.ManagementFactory;
-import java.lang.management.RuntimeMXBean;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -31,12 +29,12 @@ import org.apache.camel.component.kamelet.KameletComponent;
 import org.apache.camel.dsl.yaml.YamlRoutesBuilderLoaderSupport;
 import org.apache.camel.dsl.yaml.common.YamlDeserializationContext;
 import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport;
+import org.apache.camel.main.util.VersionHelper;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.RouteTemplateLoaderListener;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.support.service.ServiceSupport;
 import org.apache.camel.tooling.maven.MavenGav;
-import org.apache.camel.util.StringHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.snakeyaml.engine.v2.nodes.Node;
@@ -52,12 +50,17 @@ import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.nodeAt;
 public final class DependencyDownloaderKamelet extends ServiceSupport
         implements CamelContextAware, RouteTemplateLoaderListener {
 
-    private static final String KAMELETS_VERSION = "3.20.4";
+    private String kameletsVersion;
     private KameletDependencyDownloader downloader;
     private CamelContext camelContext;
 
     public DependencyDownloaderKamelet(CamelContext camelContext) {
+        this(camelContext, null);
+    }
+
+    public DependencyDownloaderKamelet(CamelContext camelContext, String kameletsVersion) {
         this.camelContext = camelContext;
+        this.kameletsVersion = kameletsVersion;
     }
 
     @Override
@@ -78,13 +81,11 @@ public final class DependencyDownloaderKamelet extends ServiceSupport
 
     @Override
     protected void doInit() throws Exception {
-        String version = KAMELETS_VERSION;
-        RuntimeMXBean mb = ManagementFactory.getRuntimeMXBean();
-        if (mb != null) {
-            String[] bootClasspath = mb.getClassPath().split("[:|;]");
-            version = extractKameletsVersion(bootClasspath);
+        if (kameletsVersion == null) {
+            kameletsVersion = VersionHelper.extractKameletsVersion();
         }
-        this.downloader = new KameletDependencyDownloader(camelContext, "yaml", version);
+
+        this.downloader = new KameletDependencyDownloader(camelContext, "yaml", kameletsVersion);
         this.downloader.setCamelContext(camelContext);
         ServiceHelper.initService(downloader);
     }
@@ -110,21 +111,6 @@ public final class DependencyDownloaderKamelet extends ServiceSupport
         }
     }
 
-    private static String extractKameletsVersion(String[] bootClasspath) {
-        if (bootClasspath != null) {
-            for (String s : bootClasspath) {
-                if (s.contains("camel-kamelets-")) {
-                    String version = StringHelper.after(s, "camel-kamelets-");
-                    version = StringHelper.before(version, ".jar");
-                    if (version != null) {
-                        return version;
-                    }
-                }
-            }
-        }
-        return KAMELETS_VERSION;
-    }
-
     /**
      * To automatic downloaded dependencies that Kamelets requires.
      */
@@ -152,8 +138,6 @@ public final class DependencyDownloaderKamelet extends ServiceSupport
             }
 
             final List<String> dependencies = new ArrayList<>();
-            // always include kamelets-utils
-            dependencies.add("org.apache.camel.kamelets:camel-kamelets-utils:" + kameletsVersion);
 
             Node deps = nodeAt(node, "/spec/dependencies");
             if (deps != null && deps.getNodeType() == NodeType.SEQUENCE) {
@@ -189,7 +173,11 @@ public final class DependencyDownloaderKamelet extends ServiceSupport
                 String gav = dep;
                 if (dep.startsWith("camel:")) {
                     // it's a known camel component
-                    gav = "org.apache.camel:camel-" + dep.substring(6) + ":" + camelContext.getVersion();
+                    gav = "org.apache.camel:camel-" + dep.substring("camel:".length()) + ":" + camelContext.getVersion();
+                } else if (dep.startsWith("camel-kamelets:")) {
+                    // it's a known camel kamelets dependency
+                    gav = "org.apache.camel.kamelets:camel-kamelets-" + dep.substring("camel-kamelets:".length()) + ":"
+                          + kameletsVersion;
                 }
                 if (isValidGav(gav)) {
                     gavs.add(gav);
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderRoutesLoader.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderRoutesLoader.java
index a4cdd2ac87c..421a6c39868 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderRoutesLoader.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderRoutesLoader.java
@@ -31,10 +31,16 @@ import org.apache.camel.support.service.ServiceHelper;
 public class DependencyDownloaderRoutesLoader extends DefaultRoutesLoader {
 
     private final DependencyDownloader downloader;
+    private final String kameletsVersion;
 
     public DependencyDownloaderRoutesLoader(CamelContext camelContext) {
+        this(camelContext, null);
+    }
+
+    public DependencyDownloaderRoutesLoader(CamelContext camelContext, String kameletsVersion) {
         setCamelContext(camelContext);
         this.downloader = camelContext.hasService(DependencyDownloader.class);
+        this.kameletsVersion = kameletsVersion;
     }
 
     @Override
@@ -65,7 +71,7 @@ public class DependencyDownloaderRoutesLoader extends DefaultRoutesLoader {
         // special for kamelet as we want to track loading kamelets
         RoutesBuilderLoader loader;
         if (KameletRoutesBuilderLoader.EXTENSION.equals(extension)) {
-            loader = new KnownKameletRoutesBuilderLoader();
+            loader = new KnownKameletRoutesBuilderLoader(kameletsVersion);
             CamelContextAware.trySetCamelContext(loader, getCamelContext());
             // allows for custom initialization
             initRoutesBuilderLoader(loader);
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownKameletRoutesBuilderLoader.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownKameletRoutesBuilderLoader.java
index 709f9ea5652..1e6588379e7 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownKameletRoutesBuilderLoader.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownKameletRoutesBuilderLoader.java
@@ -19,12 +19,11 @@ package org.apache.camel.main.download;
 import java.lang.reflect.Method;
 import java.util.Collections;
 import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.dsl.yaml.KameletRoutesBuilderLoader;
 import org.apache.camel.main.util.SuggestSimilarHelper;
+import org.apache.camel.main.util.VersionHelper;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.support.ObjectHelper;
 import org.apache.camel.util.FileUtil;
@@ -32,7 +31,11 @@ import org.apache.camel.util.ReflectionHelper;
 
 public class KnownKameletRoutesBuilderLoader extends KameletRoutesBuilderLoader {
 
-    private static final String CP = System.getProperty("java.class.path");
+    private String kameletsVersion;
+
+    public KnownKameletRoutesBuilderLoader(String kameletsVersion) {
+        this.kameletsVersion = kameletsVersion;
+    }
 
     @Override
     public RouteBuilder doLoadRouteBuilder(Resource resource) throws Exception {
@@ -52,27 +55,26 @@ public class KnownKameletRoutesBuilderLoader extends KameletRoutesBuilderLoader
 
     private List<String> findKameletNames() {
         // download kamelet catalog for the correct version
-        Pattern pattern = Pattern.compile("camel-kamelets-(\\d+.\\d+.\\d+).jar", Pattern.DOTALL);
-        Matcher matcher = pattern.matcher(CP);
-        if (matcher.find() && matcher.groupCount() > 0) {
-            String version = matcher.group(1);
-            try {
-                // dynamic download kamelets-catalog that has the known names
-                MavenDependencyDownloader downloader = getCamelContext().hasService(MavenDependencyDownloader.class);
-                if (!downloader.alreadyOnClasspath("org.apache.camel.kamelets", "camel-kamelets-catalog", version)) {
-                    downloader.downloadDependency("org.apache.camel.kamelets", "camel-kamelets-catalog", version);
-                }
-                // create an instance of the catalog and invoke its getKameletsName method
-                Class<?> clazz = getCamelContext().getClassResolver()
-                        .resolveClass("org.apache.camel.kamelets.catalog.KameletsCatalog");
-                if (clazz != null) {
-                    Object catalog = getCamelContext().getInjector().newInstance(clazz);
-                    Method m = ReflectionHelper.findMethod(clazz, "getKameletsName");
-                    return (List<String>) ObjectHelper.invokeMethod(m, catalog);
-                }
-            } catch (Exception e) {
-                // ignore
+        if (kameletsVersion == null) {
+            kameletsVersion = VersionHelper.extractKameletsVersion();
+        }
+
+        try {
+            // dynamic download kamelets-catalog that has the known names
+            MavenDependencyDownloader downloader = getCamelContext().hasService(MavenDependencyDownloader.class);
+            if (!downloader.alreadyOnClasspath("org.apache.camel.kamelets", "camel-kamelets-catalog", kameletsVersion)) {
+                downloader.downloadDependency("org.apache.camel.kamelets", "camel-kamelets-catalog", kameletsVersion);
+            }
+            // create an instance of the catalog and invoke its getKameletsName method
+            Class<?> clazz = getCamelContext().getClassResolver()
+                    .resolveClass("org.apache.camel.kamelets.catalog.KameletsCatalog");
+            if (clazz != null) {
+                Object catalog = getCamelContext().getInjector().newInstance(clazz);
+                Method m = ReflectionHelper.findMethod(clazz, "getKameletsName");
+                return (List<String>) ObjectHelper.invokeMethod(m, catalog);
             }
+        } catch (Exception e) {
+            // ignore
         }
 
         return Collections.emptyList();
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/util/VersionHelper.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/util/VersionHelper.java
index 5ada3e4c766..b8b0bf230a4 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/util/VersionHelper.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/util/VersionHelper.java
@@ -16,10 +16,19 @@
  */
 package org.apache.camel.main.util;
 
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 import org.apache.camel.util.StringHelper;
 
 public final class VersionHelper {
 
+    private static final String KAMELETS_DEFAULT_VERSION = "4.0.0-RC1";
+    private static final Pattern KAMELETS_LIBRARY = Pattern.compile("camel-kamelets-(\\d[A-Z\\d.-]*).jar", Pattern.DOTALL);
+    private static final String CP = System.getProperty("java.class.path");
+
     private VersionHelper() {
     }
 
@@ -83,4 +92,20 @@ public final class VersionHelper {
         return s.compareTo(t);
     }
 
+    public static String extractKameletsVersion() {
+        Matcher matcher = KAMELETS_LIBRARY.matcher(CP);
+        if (matcher.find() && matcher.groupCount() > 0) {
+            return matcher.group(1);
+        }
+
+        RuntimeMXBean mb = ManagementFactory.getRuntimeMXBean();
+        if (mb != null) {
+            matcher = KAMELETS_LIBRARY.matcher(mb.getClassPath());
+            if (matcher.find() && matcher.groupCount() > 0) {
+                return matcher.group(1);
+            }
+        }
+
+        return KAMELETS_DEFAULT_VERSION;
+    }
 }