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) {