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 c4bf1b9  CAMEL-17637: camel-jbang - Run goal added --dep to specify 
dependency JARs to download and add to classpath from CLI
c4bf1b9 is described below

commit c4bf1b9ef521285dd3bc34cabf08022dc9600c5a
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Wed Feb 16 19:58:59 2022 +0100

    CAMEL-17637: camel-jbang - Run goal added --dep to specify dependency JARs 
to download and add to classpath from CLI
---
 .../apache/camel/dsl/jbang/core/commands/Run.java  |  8 ++-
 .../main/CommandLineDependencyDownloader.java      | 78 ++++++++++++++++++++++
 .../java/org/apache/camel/main/KameletMain.java    |  6 ++
 .../org/apache/camel/main/KameletYamlRoutes.java   |  1 -
 4 files changed, 91 insertions(+), 2 deletions(-)

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 6bb4837..778b90d 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
@@ -52,6 +52,9 @@ class Run implements Callable<Integer> {
     @Parameters(description = "The Camel file(s) to run", arity = "1")
     private String[] files;
 
+    @Option(names = { "--dep", "--dependency" }, description = "Additional 
dependencies to add to the classpath", arity = "0")
+    private String[] dependencies;
+
     //CHECKSTYLE:OFF
     @Option(names = {"-h", "--help"}, usageHelp = true, description = "Display 
the help and sub-commands")
     private boolean helpRequested;
@@ -99,7 +102,7 @@ class Run implements Callable<Integer> {
     private String jfrProfile;
 
     @Option(names = { "--local-kamelet-dir" },
-            description = "Local directory to load Kamelets from (take 
precedence))")
+            description = "Local directory for loading Kamelets (takes 
precedence)")
     private String localKameletDir;
 
     @Option(names = { "--port" }, description = "Embeds a local HTTP server on 
this port")
@@ -188,6 +191,9 @@ class Run implements Callable<Integer> {
             main.addInitialProperty("camel.jbang.jfr", "jfr");
             main.addInitialProperty("camel.jbang.jfr-profile", jfrProfile);
         }
+        if (dependencies != null) {
+            main.addInitialProperty("camel.jbang.dependencies", 
String.join(",", dependencies));
+        }
 
         if (fileLock) {
             lockFile = createLockFile();
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/CommandLineDependencyDownloader.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/CommandLineDependencyDownloader.java
new file mode 100644
index 0000000..4146d19
--- /dev/null
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/CommandLineDependencyDownloader.java
@@ -0,0 +1,78 @@
+/*
+ * 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.main;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.support.service.ServiceSupport;
+
+public class CommandLineDependencyDownloader extends ServiceSupport implements 
CamelContextAware {
+
+    private CamelContext camelContext;
+    private final String dependencies;
+
+    public CommandLineDependencyDownloader(String dependencies) {
+        this.dependencies = dependencies;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    protected void doInit() throws Exception {
+        downloadDependencies();
+    }
+
+    private void downloadDependencies() {
+        final List<String> gavs = new ArrayList<>();
+        for (String dep : dependencies.split(",")) {
+            String gav = dep;
+            if (dep.startsWith("camel:")) {
+                // it's a known camel component
+                gav = "org.apache.camel:camel-" + dep.substring(6) + ":" + 
camelContext.getVersion();
+            }
+            if (isValidGav(gav)) {
+                gavs.add(gav);
+            }
+        }
+
+        if (!gavs.isEmpty()) {
+            for (String gav : gavs) {
+                MavenGav mg = MavenGav.parseGav(camelContext, gav);
+                DownloaderHelper.downloadDependency(camelContext, 
mg.getGroupId(), mg.getArtifactId(), mg.getVersion());
+            }
+        }
+    }
+
+    private boolean isValidGav(String gav) {
+        MavenGav mg = MavenGav.parseGav(camelContext, gav);
+        boolean exists = DownloaderHelper.alreadyOnClasspath(camelContext, 
mg.getArtifactId());
+        // valid if not already on classpath
+        return !exists;
+    }
+
+}
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 b94193d..3936ac1 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
@@ -204,6 +204,12 @@ public class KameletMain extends MainCommandLineSupport {
         if (download) {
             // use resolvers that can auto downloaded
             try {
+                // dependencies from CLI
+                Object dependencies = 
getInitialProperties().get("camel.jbang.dependencies");
+                if (dependencies != null) {
+                    answer.addService(new 
CommandLineDependencyDownloader(dependencies.toString()));
+                }
+
                 KnownDependenciesResolver known = new 
KnownDependenciesResolver(answer);
                 known.loadKnownDependencies();
                 DependencyDownloaderPropertyBindingListener listener
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletYamlRoutes.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletYamlRoutes.java
index 55f0705..3417993 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletYamlRoutes.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletYamlRoutes.java
@@ -42,7 +42,6 @@ class KameletYamlRoutes extends 
YamlRoutesBuilderLoaderSupport implements CamelC
 
     private static final Logger LOG = 
LoggerFactory.getLogger(KameletYamlRoutes.class);
     private CamelContext camelContext;
-    private final String cp = System.getProperty("java.class.path");
     private final Set<String> downloaded = new HashSet<>();
 
     public KameletYamlRoutes(String extension) {

Reply via email to