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 2022/10/12 13:52:58 UTC

[camel] 01/03: CAMEL-18603: camel-jbang - run with kamelets classloading issue

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

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

commit 7b2985e92123348bfe2e880f45e42c9da5b6313f
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Oct 12 15:47:36 2022 +0200

    CAMEL-18603: camel-jbang - run with kamelets classloading issue
---
 .../dsl/jbang/core/commands/ExportBaseCommand.java |  2 ++
 .../camel-jbang-main/dist/CamelJBang.java          |  1 -
 .../src/main/jbang/main/CamelJBang.java            |  1 -
 .../main/download/DependencyDownloaderKamelet.java | 40 ++++++++++++++++++----
 4 files changed, 35 insertions(+), 9 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 12a741293f1..bc82eb9e4a5 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
@@ -194,6 +194,7 @@ abstract class ExportBaseCommand extends CamelCommand {
                     // include yaml-dsl and kamelet catalog if we use kamelets
                     answer.add("camel:yaml-dsl");
                     answer.add("org.apache.camel.kamelets:camel-kamelets:" + kameletsVersion);
+                    answer.add("org.apache.camel.kamelets:camel-kamelets-utils:" + kameletsVersion);
                 }
             } else if (line.startsWith("camel.jbang.dependencies=")) {
                 String deps = StringHelper.after(line, "camel.jbang.dependencies=");
@@ -235,6 +236,7 @@ abstract class ExportBaseCommand extends CamelCommand {
             } else if (line.startsWith("camel.component.kamelet.location=")) {
                 // include kamelet catalog if we use kamelets
                 answer.add("mvn:org.apache.camel.kamelets:camel-kamelets:" + kameletsVersion);
+                answer.add("mvn:org.apache.camel.kamelets:camel-kamelets-utils:" + kameletsVersion);
             }
         }
 
diff --git a/dsl/camel-jbang/camel-jbang-main/dist/CamelJBang.java b/dsl/camel-jbang/camel-jbang-main/dist/CamelJBang.java
index d2df7b5ab34..4310369c751 100755
--- a/dsl/camel-jbang/camel-jbang-main/dist/CamelJBang.java
+++ b/dsl/camel-jbang/camel-jbang-main/dist/CamelJBang.java
@@ -22,7 +22,6 @@
 //DEPS org.apache.camel:camel-bom:${camel.jbang.version:3.18.1}@pom
 //DEPS org.apache.camel:camel-jbang-core:${camel.jbang.version:3.18.1}
 //DEPS org.apache.camel.kamelets:camel-kamelets:${camel-kamelets.version:0.9.0}
-//DEPS org.apache.camel.kamelets:camel-kamelets-utils:${camel-kamelets.version:0.9.0}
 
 package main;
 
diff --git a/dsl/camel-jbang/camel-jbang-main/src/main/jbang/main/CamelJBang.java b/dsl/camel-jbang/camel-jbang-main/src/main/jbang/main/CamelJBang.java
index d2df7b5ab34..4310369c751 100755
--- a/dsl/camel-jbang/camel-jbang-main/src/main/jbang/main/CamelJBang.java
+++ b/dsl/camel-jbang/camel-jbang-main/src/main/jbang/main/CamelJBang.java
@@ -22,7 +22,6 @@
 //DEPS org.apache.camel:camel-bom:${camel.jbang.version:3.18.1}@pom
 //DEPS org.apache.camel:camel-jbang-core:${camel.jbang.version:3.18.1}
 //DEPS org.apache.camel.kamelets:camel-kamelets:${camel-kamelets.version:0.9.0}
-//DEPS org.apache.camel.kamelets:camel-kamelets-utils:${camel-kamelets.version:0.9.0}
 
 package main;
 
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 5c8f0c37a56..b4fe5aa461c 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,6 +16,8 @@
  */
 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;
@@ -32,6 +34,7 @@ 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.util.StringHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.snakeyaml.engine.v2.nodes.Node;
@@ -47,12 +50,12 @@ import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.nodeAt;
 public final class DependencyDownloaderKamelet extends ServiceSupport
         implements CamelContextAware, RouteTemplateLoaderListener {
 
-    private final KameletDependencyDownloader downloader;
+    private static final String KAMELETS_VERSION = "0.9.0";
+    private KameletDependencyDownloader downloader;
     private CamelContext camelContext;
 
     public DependencyDownloaderKamelet(CamelContext camelContext) {
         this.camelContext = camelContext;
-        this.downloader = new KameletDependencyDownloader(camelContext, "yaml");
     }
 
     @Override
@@ -69,13 +72,18 @@ public final class DependencyDownloaderKamelet extends ServiceSupport
     protected void doBuild() throws Exception {
         KameletComponent kc = camelContext.getComponent("kamelet", KameletComponent.class);
         kc.setRouteTemplateLoaderListener(this);
-
-        downloader.setCamelContext(camelContext);
-        ServiceHelper.buildService(downloader);
     }
 
     @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);
+        }
+        this.downloader = new KameletDependencyDownloader(camelContext, "yaml", version);
+        this.downloader.setCamelContext(camelContext);
         ServiceHelper.initService(downloader);
     }
 
@@ -100,6 +108,21 @@ 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.
      */
@@ -109,16 +132,20 @@ public final class DependencyDownloaderKamelet extends ServiceSupport
         private final CamelContext camelContext;
         private final DependencyDownloader downloader;
         private final Set<String> downloaded = new HashSet<>();
+        private final String kameletsVersion;
 
-        public KameletDependencyDownloader(CamelContext camelContext, String extension) {
+        public KameletDependencyDownloader(CamelContext camelContext, String extension, String kameletsVersion) {
             super(extension);
             this.camelContext = camelContext;
             this.downloader = camelContext.hasService(DependencyDownloader.class);
+            this.kameletsVersion = kameletsVersion;
         }
 
         @Override
         protected RouteBuilder builder(YamlDeserializationContext ctx, Node node) {
             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) {
@@ -184,6 +211,5 @@ public final class DependencyDownloaderKamelet extends ServiceSupport
             // valid if not already on classpath
             return !exists;
         }
-
     }
 }