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/06/13 12:22:09 UTC

[camel] branch main updated: CAMEL-18188: camel-jbang - Use apache maven to download JARs instead of groovy grape

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 b08461abea2 CAMEL-18188: camel-jbang - Use apache maven to download JARs instead of groovy grape
b08461abea2 is described below

commit b08461abea2b1e08bab33e959a976e7d7d13a740
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Jun 13 14:19:13 2022 +0200

    CAMEL-18188: camel-jbang - Use apache maven to download JARs instead of groovy grape
---
 dsl/camel-jbang/camel-jbang-core/pom.xml           |   5 +
 dsl/camel-kamelet-main/pom.xml                     |  14 +-
 .../java/org/apache/camel/main/CamelGrapeIvy.java  | 178 ---------------------
 .../main/CommandLineDependencyDownloader.java      |   6 +-
 ...y.java => DependencyDownloaderClassLoader.java} |  26 +--
 .../main/DependencyDownloaderClassResolver.java    |   8 +-
 .../DependencyDownloaderComponentResolver.java     |   7 +-
 .../DependencyDownloaderDataFormatResolver.java    |   7 +-
 .../camel/main/DependencyDownloaderKamelet.java    |  14 +-
 .../main/DependencyDownloaderLanguageResolver.java |   7 +-
 ...ependencyDownloaderPropertyBindingListener.java |   7 +-
 .../main/DependencyDownloaderResourceLoader.java   |   8 +-
 .../main/DependencyDownloaderRoutesLoader.java     |   7 +-
 .../camel/main/DependencyDownloaderStrategy.java   |   6 +-
 .../java/org/apache/camel/main/DependencyUtil.java |  94 +++++++++++
 ...nloaderStrategy.java => DownloadException.java} |  21 +--
 .../org/apache/camel/main/DownloadThreadPool.java  |   2 +-
 .../org/apache/camel/main/DownloaderHelper.java    |  80 +++------
 .../java/org/apache/camel/main/KameletMain.java    |  34 ++--
 ...yDownloaderStrategy.java => MavenArtifact.java} |  30 ++--
 .../src/main/resources/camelGrapeConfig.xml        |  41 -----
 .../src/main/resources/localGrapeConfig.xml        |  36 -----
 .../org/apache/camel/main/DependencyUtilTest.java} |  26 ++-
 23 files changed, 244 insertions(+), 420 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/pom.xml b/dsl/camel-jbang/camel-jbang-core/pom.xml
index c3eb3147d06..4a304f38230 100644
--- a/dsl/camel-jbang/camel-jbang-core/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-core/pom.xml
@@ -51,6 +51,11 @@
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-kamelet-main</artifactId>
         </dependency>
+        <!-- TODO: uber-jar uses grape for download -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-grape</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-resourceresolver-github</artifactId>
diff --git a/dsl/camel-kamelet-main/pom.xml b/dsl/camel-kamelet-main/pom.xml
index e97a54cbc2d..598408c0637 100644
--- a/dsl/camel-kamelet-main/pom.xml
+++ b/dsl/camel-kamelet-main/pom.xml
@@ -40,6 +40,7 @@
     </properties>
 
     <dependencies>
+
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-main</artifactId>
@@ -76,10 +77,6 @@
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-jfr</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-grape</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-platform-http-vertx</artifactId>
@@ -108,7 +105,12 @@
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-catalog-console</artifactId>
         </dependency>
-
+        <!-- maven downloader -->
+        <dependency>
+            <groupId>org.jboss.shrinkwrap.resolver</groupId>
+            <artifactId>shrinkwrap-resolver-impl-maven</artifactId>
+            <version>3.1.4</version>
+        </dependency>
         <!-- optional spring annotation support -->
         <dependency>
             <groupId>org.springframework</groupId>
@@ -127,6 +129,7 @@
             <version>${microprofile-config-version}</version>
         </dependency>
 
+        <!-- test -->
         <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-api</artifactId>
@@ -142,7 +145,6 @@
             <artifactId>log4j-slf4j-impl</artifactId>
             <scope>test</scope>
         </dependency>
-
     </dependencies>
 
     <build>
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/CamelGrapeIvy.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/CamelGrapeIvy.java
deleted file mode 100644
index 45c1813cb90..00000000000
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/CamelGrapeIvy.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * 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.io.IOException;
-import java.text.ParseException;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import groovy.grape.GrapeIvy;
-import org.apache.ivy.Ivy;
-import org.apache.ivy.core.IvyContext;
-import org.apache.ivy.core.cache.ResolutionCacheManager;
-import org.apache.ivy.core.event.IvyEvent;
-import org.apache.ivy.core.event.IvyListener;
-import org.apache.ivy.core.event.download.PrepareDownloadEvent;
-import org.apache.ivy.core.event.resolve.StartResolveEvent;
-import org.apache.ivy.core.module.descriptor.Artifact;
-import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
-import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
-import org.apache.ivy.core.report.ResolveReport;
-import org.apache.ivy.core.resolve.ResolveOptions;
-import org.apache.ivy.core.settings.IvySettings;
-import org.apache.ivy.util.filter.Filter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static groovy.grape.Grape.AUTO_DOWNLOAD_SETTING;
-import static groovy.grape.Grape.DISABLE_CHECKSUMS_SETTING;
-
-public class CamelGrapeIvy extends GrapeIvy {
-
-    private static final Logger LOG = LoggerFactory.getLogger(CamelGrapeIvy.class);
-
-    private static CamelGrapeIvy instance;
-    private final Set<Artifact> extra = new HashSet<>();
-
-    public CamelGrapeIvy(boolean reportDownloads) {
-        super();
-
-        // use wrapper as facade so we can hook into downloading
-        Ivy wrapper = new IvyWrapper(super.getIvyInstance(), reportDownloads);
-        setIvyInstance(wrapper);
-        IvyContext.getContext().setIvy(wrapper);
-    }
-
-    private static synchronized CamelGrapeIvy getInstance(boolean reportDownload) {
-        if (instance == null) {
-            instance = new CamelGrapeIvy(reportDownload);
-        }
-        return instance;
-    }
-
-    public static Set<MavenGav> download(Map<String, Object> dependency, boolean reportDownload) {
-        Set<MavenGav> extra = new HashSet<>();
-
-        CamelGrapeIvy instance = getInstance(reportDownload);
-        if (instance != null) {
-            if (!dependency.containsKey(AUTO_DOWNLOAD_SETTING)) {
-                dependency.put(AUTO_DOWNLOAD_SETTING, "true");
-            }
-            if (!dependency.containsKey(DISABLE_CHECKSUMS_SETTING)) {
-                dependency.put(DISABLE_CHECKSUMS_SETTING, "false");
-            }
-
-            instance.extra.clear();
-            instance.grab(dependency);
-            if (instance.extra.size() > 0) {
-                for (Artifact a : instance.extra) {
-                    String gid = a.getModuleRevisionId().getOrganisation();
-                    String aid = a.getModuleRevisionId().getName();
-                    String v = a.getModuleRevisionId().getRevision();
-                    MavenGav gav = new MavenGav();
-                    gav.setGroupId(gid);
-                    gav.setArtifactId(aid);
-                    gav.setVersion(v);
-                    extra.add(gav);
-                }
-            }
-            instance.extra.clear();
-        }
-
-        return extra;
-    }
-
-    private class IvyWrapper extends Ivy implements Filter<Artifact> {
-
-        private final Ivy delegate;
-
-        public IvyWrapper(Ivy delegate, boolean reportDownloads) {
-            this.delegate = delegate;
-            if (reportDownloads) {
-                addIvyListener();
-            }
-        }
-
-        @Override
-        public ResolutionCacheManager getResolutionCacheManager() {
-            return delegate.getResolutionCacheManager();
-        }
-
-        @Override
-        public IvySettings getSettings() {
-            return delegate.getSettings();
-        }
-
-        @Override
-        public ResolveReport resolve(ModuleDescriptor md, ResolveOptions options)
-                throws ParseException, IOException {
-            options.setArtifactFilter(this);
-            return delegate.resolve(md, options);
-        }
-
-        @Override
-        public boolean accept(Artifact a) {
-            boolean ok = true;
-            String type = a.getType();
-            if (type != null) {
-                // only jar,pom is supported
-                ok = "jar".equals(type) || "pom".equals(type);
-                if (!ok && "bundle".equals(type) && "jar".equals(a.getExt())) {
-                    // remember as extra download because it cannot be downloaded as bundle type
-                    extra.add(a);
-                }
-            }
-            LOG.trace("Accept Artifact: {}={}", a, ok);
-            return ok;
-        }
-
-        private void addIvyListener() {
-            delegate.getEventManager().addIvyListener(new IvyListener() {
-                private final Set<String> downloadedArtifacts = new HashSet<>();
-                private final Set<String> resolvedDependencies = new HashSet<>();
-
-                @Override
-                public void progress(IvyEvent event) {
-                    if (event instanceof StartResolveEvent) {
-                        DependencyDescriptor[] deps = ((StartResolveEvent) event).getModuleDescriptor().getDependencies();
-                        if (deps != null) {
-                            for (DependencyDescriptor dd : deps) {
-                                var name = dd.toString();
-                                if (resolvedDependencies.add(name)) {
-                                    LOG.info("Resolving: {}", name);
-                                }
-                            }
-                        }
-                    } else if (event instanceof PrepareDownloadEvent) {
-                        Artifact[] arts = ((PrepareDownloadEvent) event).getArtifacts();
-                        if (arts != null) {
-                            for (Artifact a : arts) {
-                                var name = a.toString();
-                                if (downloadedArtifacts.add(name)) {
-                                    LOG.info("Downloading: {}", name);
-                                }
-                            }
-                        }
-                    }
-                }
-            });
-        }
-    }
-
-}
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
index bb598455bf6..8fbea1a351f 100644
--- 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
@@ -27,9 +27,11 @@ public class CommandLineDependencyDownloader extends ServiceSupport implements C
 
     private CamelContext camelContext;
     private final String dependencies;
+    private final String repos;
 
-    public CommandLineDependencyDownloader(String dependencies) {
+    public CommandLineDependencyDownloader(String dependencies, String repos) {
         this.dependencies = dependencies;
+        this.repos = repos;
     }
 
     @Override
@@ -63,7 +65,7 @@ public class CommandLineDependencyDownloader extends ServiceSupport implements C
         if (!gavs.isEmpty()) {
             for (String gav : gavs) {
                 MavenGav mg = MavenGav.parseGav(camelContext, gav);
-                DownloaderHelper.downloadDependency(camelContext, mg.getGroupId(), mg.getArtifactId(), mg.getVersion());
+                DownloaderHelper.downloadDependency(camelContext, repos, mg.getGroupId(), mg.getArtifactId(), mg.getVersion());
             }
         }
     }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderClassLoader.java
similarity index 55%
copy from dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java
copy to dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderClassLoader.java
index 6287fb78577..723a976222b 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderClassLoader.java
@@ -16,24 +16,24 @@
  */
 package org.apache.camel.main;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.spi.DependencyStrategy;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
 
-class DependencyDownloaderStrategy implements DependencyStrategy {
+public class DependencyDownloaderClassLoader extends URLClassLoader {
 
-    private final CamelContext camelContext;
+    private static final URL[] EMPTY_URL_ARRAY = new URL[0];
 
-    public DependencyDownloaderStrategy(CamelContext camelContext) {
-        this.camelContext = camelContext;
+    public DependencyDownloaderClassLoader(ClassLoader parent) {
+        super(EMPTY_URL_ARRAY, parent);
     }
 
-    @Override
-    public void onDependency(String dependency) {
-        MavenGav gav = MavenGav.parseGav(camelContext, dependency);
-        if (!DownloaderHelper.alreadyOnClasspath(camelContext, gav.getGroupId(), gav.getArtifactId(), gav.getVersion())) {
-            DownloaderHelper.downloadDependency(camelContext, gav.getGroupId(), gav.getArtifactId(),
-                    gav.getVersion());
+    public void addFile(File file) {
+        try {
+            super.addURL(file.toURI().toURL());
+        } catch (MalformedURLException e) {
+            throw new DownloadException("Error adding JAR to classloader: " + file, e);
         }
     }
-
 }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderClassResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderClassResolver.java
index d638fe88fb5..cdec350fb63 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderClassResolver.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderClassResolver.java
@@ -23,10 +23,14 @@ import org.apache.camel.util.ObjectHelper;
 final class DependencyDownloaderClassResolver extends DefaultClassResolver {
 
     private final KnownDependenciesResolver knownDependenciesResolver;
+    private final String repos;
 
-    public DependencyDownloaderClassResolver(CamelContext camelContext, KnownDependenciesResolver knownDependenciesResolver) {
+    public DependencyDownloaderClassResolver(CamelContext camelContext,
+                                             KnownDependenciesResolver knownDependenciesResolver,
+                                             String repos) {
         super(camelContext);
         this.knownDependenciesResolver = knownDependenciesResolver;
+        this.repos = repos;
     }
 
     @Override
@@ -44,7 +48,7 @@ final class DependencyDownloaderClassResolver extends DefaultClassResolver {
             if (gav != null) {
                 if (!DownloaderHelper.alreadyOnClasspath(getCamelContext(), gav.getGroupId(), gav.getArtifactId(),
                         gav.getVersion())) {
-                    DownloaderHelper.downloadDependency(getCamelContext(), gav.getGroupId(), gav.getArtifactId(),
+                    DownloaderHelper.downloadDependency(getCamelContext(), repos, gav.getGroupId(), gav.getArtifactId(),
                             gav.getVersion());
                 }
                 try {
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderComponentResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderComponentResolver.java
index a4cff33c85b..c323d9057f5 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderComponentResolver.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderComponentResolver.java
@@ -34,10 +34,12 @@ final class DependencyDownloaderComponentResolver extends DefaultComponentResolv
 
     private final CamelCatalog catalog = new DefaultCamelCatalog();
     private CamelContext camelContext;
+    private final String repos;
     private boolean stub;
 
-    public DependencyDownloaderComponentResolver(CamelContext camelContext, boolean stub) {
+    public DependencyDownloaderComponentResolver(CamelContext camelContext, String repos, boolean stub) {
         this.camelContext = camelContext;
+        this.repos = repos;
         this.stub = stub;
     }
 
@@ -56,7 +58,8 @@ final class DependencyDownloaderComponentResolver extends DefaultComponentResolv
         ComponentModel model = catalog.componentModel(name);
         if (model != null && !DownloaderHelper.alreadyOnClasspath(camelContext, model.getGroupId(), model.getArtifactId(),
                 model.getVersion())) {
-            DownloaderHelper.downloadDependency(camelContext, model.getGroupId(), model.getArtifactId(), model.getVersion());
+            DownloaderHelper.downloadDependency(camelContext, repos, model.getGroupId(), model.getArtifactId(),
+                    model.getVersion());
         }
 
         Component answer;
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderDataFormatResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderDataFormatResolver.java
index af118d7579e..e3eccdfc5eb 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderDataFormatResolver.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderDataFormatResolver.java
@@ -31,9 +31,11 @@ final class DependencyDownloaderDataFormatResolver extends DefaultDataFormatReso
 
     private final CamelCatalog catalog = new DefaultCamelCatalog();
     private CamelContext camelContext;
+    private final String repos;
 
-    public DependencyDownloaderDataFormatResolver(CamelContext camelContext) {
+    public DependencyDownloaderDataFormatResolver(CamelContext camelContext, String repos) {
         this.camelContext = camelContext;
+        this.repos = repos;
     }
 
     @Override
@@ -51,7 +53,8 @@ final class DependencyDownloaderDataFormatResolver extends DefaultDataFormatReso
         DataFormatModel model = catalog.dataFormatModel(name);
         if (model != null && !DownloaderHelper.alreadyOnClasspath(camelContext, model.getGroupId(), model.getArtifactId(),
                 model.getVersion())) {
-            DownloaderHelper.downloadDependency(camelContext, model.getGroupId(), model.getArtifactId(), model.getVersion());
+            DownloaderHelper.downloadDependency(camelContext, repos, model.getGroupId(), model.getArtifactId(),
+                    model.getVersion());
         }
         return super.createDataFormat(name, context);
     }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderKamelet.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderKamelet.java
index caae629d72a..9722e487160 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderKamelet.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderKamelet.java
@@ -46,9 +46,14 @@ import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.nodeAt;
  */
 final class DependencyDownloaderKamelet extends ServiceSupport implements CamelContextAware, RouteTemplateLoaderListener {
 
-    private final KameletDependencyDownloader downloader = new KameletDependencyDownloader("yaml");
+    private final KameletDependencyDownloader downloader;
     private CamelContext camelContext;
 
+    public DependencyDownloaderKamelet(CamelContext camelContext, String repos) {
+        this.camelContext = camelContext;
+        this.downloader = new KameletDependencyDownloader("yaml", repos);
+    }
+
     @Override
     public CamelContext getCamelContext() {
         return camelContext;
@@ -102,9 +107,11 @@ final class DependencyDownloaderKamelet extends ServiceSupport implements CamelC
         private static final Logger LOG = LoggerFactory.getLogger(KameletDependencyDownloader.class);
         private CamelContext camelContext;
         private final Set<String> downloaded = new HashSet<>();
+        private final String repos;
 
-        public KameletDependencyDownloader(String extension) {
+        public KameletDependencyDownloader(String extension, String repos) {
             super(extension);
+            this.repos = repos;
         }
 
         @Override
@@ -163,7 +170,8 @@ final class DependencyDownloaderKamelet extends ServiceSupport implements CamelC
             if (!gavs.isEmpty()) {
                 for (String gav : gavs) {
                     MavenGav mg = MavenGav.parseGav(camelContext, gav);
-                    DownloaderHelper.downloadDependency(camelContext, mg.getGroupId(), mg.getArtifactId(), mg.getVersion());
+                    DownloaderHelper.downloadDependency(camelContext, repos, mg.getGroupId(), mg.getArtifactId(),
+                            mg.getVersion());
                     downloaded.add(gav);
                 }
             }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderLanguageResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderLanguageResolver.java
index 40975edd412..a4a60faa170 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderLanguageResolver.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderLanguageResolver.java
@@ -31,9 +31,11 @@ final class DependencyDownloaderLanguageResolver extends DefaultLanguageResolver
 
     private final CamelCatalog catalog = new DefaultCamelCatalog();
     private CamelContext camelContext;
+    private final String repos;
 
-    public DependencyDownloaderLanguageResolver(CamelContext camelContext) {
+    public DependencyDownloaderLanguageResolver(CamelContext camelContext, String repos) {
         this.camelContext = camelContext;
+        this.repos = repos;
     }
 
     @Override
@@ -51,7 +53,8 @@ final class DependencyDownloaderLanguageResolver extends DefaultLanguageResolver
         LanguageModel model = catalog.languageModel(name);
         if (model != null && !DownloaderHelper.alreadyOnClasspath(camelContext, model.getGroupId(), model.getArtifactId(),
                 model.getVersion())) {
-            DownloaderHelper.downloadDependency(camelContext, model.getGroupId(), model.getArtifactId(), model.getVersion());
+            DownloaderHelper.downloadDependency(camelContext, repos, model.getGroupId(), model.getArtifactId(),
+                    model.getVersion());
         }
 
         return super.resolveLanguage(name, context);
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderPropertyBindingListener.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderPropertyBindingListener.java
index 4054071bd00..a3248356aff 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderPropertyBindingListener.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderPropertyBindingListener.java
@@ -23,11 +23,14 @@ class DependencyDownloaderPropertyBindingListener implements PropertyBindingList
 
     private final CamelContext camelContext;
     private final KnownDependenciesResolver knownDependenciesResolver;
+    private final String repos;
 
     public DependencyDownloaderPropertyBindingListener(CamelContext camelContext,
-                                                       KnownDependenciesResolver knownDependenciesResolver) {
+                                                       KnownDependenciesResolver knownDependenciesResolver,
+                                                       String repos) {
         this.camelContext = camelContext;
         this.knownDependenciesResolver = knownDependenciesResolver;
+        this.repos = repos;
     }
 
     @Override
@@ -38,7 +41,7 @@ class DependencyDownloaderPropertyBindingListener implements PropertyBindingList
             if (gav != null) {
                 if (!DownloaderHelper.alreadyOnClasspath(camelContext, gav.getGroupId(), gav.getArtifactId(),
                         gav.getVersion())) {
-                    DownloaderHelper.downloadDependency(camelContext, gav.getGroupId(), gav.getArtifactId(),
+                    DownloaderHelper.downloadDependency(camelContext, repos, gav.getGroupId(), gav.getArtifactId(),
                             gav.getVersion());
                 }
             }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderResourceLoader.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderResourceLoader.java
index c468a569145..74b7c9fc958 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderResourceLoader.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderResourceLoader.java
@@ -24,8 +24,11 @@ import org.apache.camel.util.StringHelper;
 
 class DependencyDownloaderResourceLoader extends DefaultResourceLoader {
 
-    public DependencyDownloaderResourceLoader(CamelContext camelContext) {
+    private final String repos;
+
+    public DependencyDownloaderResourceLoader(CamelContext camelContext, String repos) {
         super(camelContext);
+        this.repos = repos;
     }
 
     @Override
@@ -37,7 +40,8 @@ class DependencyDownloaderResourceLoader extends DefaultResourceLoader {
                 if (!DownloaderHelper.alreadyOnClasspath(
                         getCamelContext(), "org.apache.camel", "camel-resourceresolver-github",
                         getCamelContext().getVersion())) {
-                    DownloaderHelper.downloadDependency(getCamelContext(), "org.apache.camel", "camel-resourceresolver-github",
+                    DownloaderHelper.downloadDependency(getCamelContext(), repos, "org.apache.camel",
+                            "camel-resourceresolver-github",
                             getCamelContext().getVersion());
                 }
             }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderRoutesLoader.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderRoutesLoader.java
index dccfec89ba7..b86f3a7ddf0 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderRoutesLoader.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderRoutesLoader.java
@@ -28,8 +28,11 @@ import org.apache.camel.support.service.ServiceHelper;
  */
 public class DependencyDownloaderRoutesLoader extends MainRoutesLoader {
 
-    public DependencyDownloaderRoutesLoader(MainConfigurationProperties configuration) {
+    private final String repos;
+
+    public DependencyDownloaderRoutesLoader(MainConfigurationProperties configuration, String repos) {
         super(configuration);
+        this.repos = repos;
     }
 
     @Override
@@ -79,7 +82,7 @@ public class DependencyDownloaderRoutesLoader extends MainRoutesLoader {
     private void downloadLoader(String artifactId) {
         if (!DownloaderHelper.alreadyOnClasspath(getCamelContext(), "org.apache.camel", artifactId,
                 getCamelContext().getVersion())) {
-            DownloaderHelper.downloadDependency(getCamelContext(), "org.apache.camel", artifactId,
+            DownloaderHelper.downloadDependency(getCamelContext(), repos, "org.apache.camel", artifactId,
                     getCamelContext().getVersion());
         }
     }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java
index 6287fb78577..8eeaa18d27d 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java
@@ -22,16 +22,18 @@ import org.apache.camel.spi.DependencyStrategy;
 class DependencyDownloaderStrategy implements DependencyStrategy {
 
     private final CamelContext camelContext;
+    private final String repos;
 
-    public DependencyDownloaderStrategy(CamelContext camelContext) {
+    public DependencyDownloaderStrategy(CamelContext camelContext, String repos) {
         this.camelContext = camelContext;
+        this.repos = repos;
     }
 
     @Override
     public void onDependency(String dependency) {
         MavenGav gav = MavenGav.parseGav(camelContext, dependency);
         if (!DownloaderHelper.alreadyOnClasspath(camelContext, gav.getGroupId(), gav.getArtifactId(), gav.getVersion())) {
-            DownloaderHelper.downloadDependency(camelContext, gav.getGroupId(), gav.getArtifactId(),
+            DownloaderHelper.downloadDependency(camelContext, repos, gav.getGroupId(), gav.getArtifactId(),
                     gav.getVersion());
         }
     }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyUtil.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyUtil.java
new file mode 100644
index 00000000000..46aa80fdd50
--- /dev/null
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyUtil.java
@@ -0,0 +1,94 @@
+/*
+ * 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.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.jboss.shrinkwrap.resolver.api.ResolutionException;
+import org.jboss.shrinkwrap.resolver.api.maven.ConfigurableMavenResolverSystem;
+import org.jboss.shrinkwrap.resolver.api.maven.Maven;
+import org.jboss.shrinkwrap.resolver.api.maven.MavenFormatStage;
+import org.jboss.shrinkwrap.resolver.api.maven.MavenResolvedArtifact;
+import org.jboss.shrinkwrap.resolver.api.maven.MavenStrategyStage;
+import org.jboss.shrinkwrap.resolver.api.maven.repository.MavenRemoteRepositories;
+import org.jboss.shrinkwrap.resolver.api.maven.repository.MavenRemoteRepository;
+import org.jboss.shrinkwrap.resolver.api.maven.repository.MavenUpdatePolicy;
+
+final class DependencyUtil {
+
+    private DependencyUtil() {
+    }
+
+    public static List<MavenArtifact> resolveDependenciesViaAether(
+            List<String> depIds, List<String> customRepos,
+            boolean offline, boolean updateCache, boolean transitively) {
+
+        ConfigurableMavenResolverSystem resolver = Maven.configureResolver()
+                .withMavenCentralRepo(true)
+                .workOffline(offline);
+
+        if (customRepos != null) {
+            for (int i = 0; i < customRepos.size(); i++) {
+                String repo = customRepos.get(i);
+                MavenRemoteRepository repository
+                        = MavenRemoteRepositories.createRemoteRepository("custom" + i + 1, repo, "default");
+                if (updateCache) {
+                    repository.setUpdatePolicy(MavenUpdatePolicy.UPDATE_POLICY_ALWAYS);
+                }
+                resolver.withRemoteRepo(repository);
+            }
+        }
+
+        System.setProperty("maven.repo.local", getLocalMavenRepo().toAbsolutePath().toString());
+        try {
+            MavenStrategyStage resolve = resolver.resolve(depIds);
+
+            MavenFormatStage stage = transitively ? resolve.withTransitivity() : resolve.withoutTransitivity();
+            List<MavenResolvedArtifact> artifacts = stage.asList(MavenResolvedArtifact.class);
+
+            return artifacts.stream()
+                    .map(mra -> {
+                        String gav = mra.getCoordinate().getGroupId() + ":" + mra.getCoordinate().getArtifactId() + ":"
+                                     + mra.getCoordinate().getVersion();
+                        return new MavenArtifact(MavenGav.parseGav(null, gav), mra.asFile());
+                    })
+                    .collect(Collectors.toList());
+        } catch (ResolutionException e) {
+            String msg = "Cannot resolve dependencies from maven central";
+            if (customRepos != null) {
+                msg = "Cannot resolve dependencies from " + String.join(", ", customRepos);
+            }
+            throw new DownloadException(msg, e);
+        } catch (RuntimeException e) {
+            throw new DownloadException("Unknown error occurred while trying to resolve dependencies", e);
+        }
+    }
+
+    public static Path getLocalMavenRepo() {
+        return Paths.get((String) System.getProperties()
+                .getOrDefault("maven.repo.local",
+                        System.getProperty("user.home")
+                                                  + File.separator + ".m2" + File.separator
+                                                  + "repository"))
+                .toAbsolutePath();
+    }
+
+}
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloadException.java
similarity index 54%
copy from dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java
copy to dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloadException.java
index 6287fb78577..588f445df11 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloadException.java
@@ -16,24 +16,13 @@
  */
 package org.apache.camel.main;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.spi.DependencyStrategy;
+public class DownloadException extends RuntimeException {
 
-class DependencyDownloaderStrategy implements DependencyStrategy {
-
-    private final CamelContext camelContext;
-
-    public DependencyDownloaderStrategy(CamelContext camelContext) {
-        this.camelContext = camelContext;
+    public DownloadException(String message) {
+        super(message);
     }
 
-    @Override
-    public void onDependency(String dependency) {
-        MavenGav gav = MavenGav.parseGav(camelContext, dependency);
-        if (!DownloaderHelper.alreadyOnClasspath(camelContext, gav.getGroupId(), gav.getArtifactId(), gav.getVersion())) {
-            DownloaderHelper.downloadDependency(camelContext, gav.getGroupId(), gav.getArtifactId(),
-                    gav.getVersion());
-        }
+    public DownloadException(String message, Throwable cause) {
+        super(message, cause);
     }
-
 }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloadThreadPool.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloadThreadPool.java
index 6c05046ef40..303a8eaf688 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloadThreadPool.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloadThreadPool.java
@@ -48,7 +48,7 @@ class DownloadThreadPool {
             } catch (TimeoutException e) {
                 // not done
             } catch (Exception e) {
-                log.error("Error downloading: " + gav + " due: " + e.getMessage());
+                log.error("Error downloading: " + gav + " due: " + e.getMessage(), e);
                 return;
             }
             if (!done) {
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloaderHelper.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloaderHelper.java
index ec58e90a6ff..1b45164789d 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloaderHelper.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloaderHelper.java
@@ -17,16 +17,13 @@
 package org.apache.camel.main;
 
 import java.io.File;
-import java.io.InputStream;
 import java.net.URL;
 import java.net.URLClassLoader;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.util.IOHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,12 +36,13 @@ public final class DownloaderHelper {
     private static final String CP = System.getProperty("java.class.path");
 
     private static final DownloadThreadPool DOWNLOAD_THREAD_POOL = new DownloadThreadPool();
-    private static final AtomicBoolean VERBOSE_DOWNLOAD = new AtomicBoolean();
 
     private DownloaderHelper() {
     }
 
-    public static void downloadDependency(CamelContext camelContext, String groupId, String artifactId, String version) {
+    public static void downloadDependency(
+            CamelContext camelContext, String repos,
+            String groupId, String artifactId, String version) {
 
         // trigger listener
         DownloadListener listener = camelContext.getExtension(DownloadListener.class);
@@ -67,25 +65,23 @@ public final class DownloaderHelper {
             }
         }
 
-        Map<String, Object> map = new HashMap<>();
-        map.put("classLoader", camelContext.getApplicationContextClassLoader());
-        map.put("group", groupId);
-        map.put("module", artifactId);
-        map.put("version", version);
-        map.put("classifier", "");
-
         String gav = groupId + ":" + artifactId + ":" + version;
         DOWNLOAD_THREAD_POOL.download(LOG, () -> {
             LOG.debug("Downloading: {}", gav);
-            Set<MavenGav> extra = CamelGrapeIvy.download(map, VERBOSE_DOWNLOAD.get());
-            for (MavenGav egav : extra) {
-                Map<String, Object> emap = new HashMap<>();
-                emap.put("classLoader", camelContext.getApplicationContextClassLoader());
-                emap.put("group", egav.getGroupId());
-                emap.put("module", egav.getArtifactId());
-                emap.put("version", egav.getVersion());
-                LOG.debug("Downloading Additional: {}", egav);
-                CamelGrapeIvy.download(emap, VERBOSE_DOWNLOAD.get());
+            List<String> deps = List.of(gav);
+            List<String> customRepos = null;
+            if (repos != null) {
+                customRepos = Arrays.stream(repos.split(",")).collect(Collectors.toList());
+            }
+            List<MavenArtifact> artifacts = DependencyUtil.resolveDependenciesViaAether(deps, customRepos, false, true, true);
+            LOG.debug("Resolved {} -> [{}]", gav, artifacts);
+
+            DependencyDownloaderClassLoader classLoader
+                    = (DependencyDownloaderClassLoader) camelContext.getApplicationContextClassLoader();
+            for (MavenArtifact a : artifacts) {
+                File file = a.getFile();
+                classLoader.addFile(file);
+                LOG.trace("Added classpath: {}", a.getGav());
             }
         }, gav);
     }
@@ -122,40 +118,4 @@ public final class DownloaderHelper {
         return false;
     }
 
-    public static void prepareDownloader(CamelContext camelContext, String repos, boolean download, boolean verbose)
-            throws Exception {
-        InputStream is = download
-                ? DownloaderHelper.class.getResourceAsStream("/camelGrapeConfig.xml")
-                : DownloaderHelper.class.getResourceAsStream("/localGrapeConfig.xml");
-        if (is != null) {
-            String xml = IOHelper.loadText(is);
-            if (download && repos != null) {
-                StringBuilder sb = new StringBuilder();
-                sb.append("            <!-- custom repositories -->");
-                int i = 0;
-                for (String repo : repos.split(",")) {
-                    i++;
-                    sb.append(String.format("\n            <url name=\"custom%s\" m2compatible=\"true\">", i));
-                    sb.append(String.format(
-                            "\n                <artifact pattern=\"%s/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]\"/>",
-                            repo));
-                    sb.append(String.format("\n            </url>"));
-                }
-                xml = xml.replace("            <!-- @repos@ -->", sb.toString());
-            }
-
-            // save file to local disk and point grape to use this
-            File out = new File(".camel-jbang/camelGrapeConfig.xml");
-            IOHelper.writeText(xml, out);
-
-            // Grape should use our custom configuration file
-            System.setProperty("grape.config", out.getAbsolutePath());
-            if (verbose) {
-                VERBOSE_DOWNLOAD.set(true);
-            }
-
-            IOHelper.close(is);
-        }
-    }
-
 }
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 039c9bc605c..506f55a3835 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
@@ -21,7 +21,6 @@ import java.util.LinkedList;
 import java.util.Map;
 import java.util.Objects;
 
-import groovy.lang.GroovyClassLoader;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.ProducerTemplate;
@@ -43,7 +42,7 @@ public class KameletMain extends MainCommandLineSupport {
     private String repos;
     private boolean stub;
     private DownloadListener downloadListener;
-    private GroovyClassLoader groovyClassLoader;
+    private DependencyDownloaderClassLoader classLoader;
 
     public KameletMain() {
         configureInitialProperties(DEFAULT_KAMELETS_LOCATION);
@@ -320,29 +319,25 @@ public class KameletMain extends MainCommandLineSupport {
         }
 
         try {
-            // prepare grape config with custom repositories
-            // use resolvers that can auto downloaded (either local or over the internet)
-            DownloaderHelper.prepareDownloader(camelContext, repos, download, downloadVerbose);
-
             // dependencies from CLI
             Object dependencies = getInitialProperties().get("camel.jbang.dependencies");
             if (dependencies != null) {
-                answer.addService(new CommandLineDependencyDownloader(dependencies.toString()));
+                answer.addService(new CommandLineDependencyDownloader(dependencies.toString(), repos));
             }
 
             KnownDependenciesResolver known = new KnownDependenciesResolver(answer);
             known.loadKnownDependencies();
             DependencyDownloaderPropertyBindingListener listener
-                    = new DependencyDownloaderPropertyBindingListener(answer, known);
+                    = new DependencyDownloaderPropertyBindingListener(answer, known, repos);
             answer.getRegistry().bind(DependencyDownloaderPropertyBindingListener.class.getName(), listener);
             answer.getRegistry().bind(DependencyDownloaderStrategy.class.getName(),
-                    new DependencyDownloaderStrategy(answer));
-            answer.setClassResolver(new DependencyDownloaderClassResolver(answer, known));
-            answer.setComponentResolver(new DependencyDownloaderComponentResolver(answer, stub));
-            answer.setDataFormatResolver(new DependencyDownloaderDataFormatResolver(answer));
-            answer.setLanguageResolver(new DependencyDownloaderLanguageResolver(answer));
-            answer.setResourceLoader(new DependencyDownloaderResourceLoader(answer));
-            answer.addService(new DependencyDownloaderKamelet());
+                    new DependencyDownloaderStrategy(answer, repos));
+            answer.setClassResolver(new DependencyDownloaderClassResolver(answer, known, repos));
+            answer.setComponentResolver(new DependencyDownloaderComponentResolver(answer, repos, stub));
+            answer.setDataFormatResolver(new DependencyDownloaderDataFormatResolver(answer, repos));
+            answer.setLanguageResolver(new DependencyDownloaderLanguageResolver(answer, repos));
+            answer.setResourceLoader(new DependencyDownloaderResourceLoader(answer, repos));
+            answer.addService(new DependencyDownloaderKamelet(answer, repos));
         } catch (Exception e) {
             throw RuntimeCamelException.wrapRuntimeException(e);
         }
@@ -359,7 +354,7 @@ public class KameletMain extends MainCommandLineSupport {
     }
 
     protected ClassLoader createApplicationContextClassLoader() {
-        if (groovyClassLoader == null) {
+        if (classLoader == null) {
             // create class loader (that are download capable) only once
             // any additional files to add to classpath
             ClassLoader parentCL = KameletMain.class.getClassLoader();
@@ -368,16 +363,17 @@ public class KameletMain extends MainCommandLineSupport {
                 parentCL = new ExtraFilesClassLoader(parentCL, cpFiles.split(","));
                 LOG.info("Additional files added to classpath: {}", cpFiles);
             }
-            groovyClassLoader = new GroovyClassLoader(parentCL);
+            classLoader = new DependencyDownloaderClassLoader(parentCL);
         }
-        return groovyClassLoader;
+        return classLoader;
     }
 
     @Override
     protected void configureRoutesLoader(CamelContext camelContext) {
         if (download) {
             // use resolvers that can auto downloaded
-            camelContext.adapt(ExtendedCamelContext.class).setRoutesLoader(new DependencyDownloaderRoutesLoader(configure()));
+            camelContext.adapt(ExtendedCamelContext.class)
+                    .setRoutesLoader(new DependencyDownloaderRoutesLoader(configure(), repos));
         } else {
             super.configureRoutesLoader(camelContext);
         }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/MavenArtifact.java
similarity index 55%
copy from dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java
copy to dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/MavenArtifact.java
index 6287fb78577..9962f561d16 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/MavenArtifact.java
@@ -16,24 +16,28 @@
  */
 package org.apache.camel.main;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.spi.DependencyStrategy;
+import java.io.File;
 
-class DependencyDownloaderStrategy implements DependencyStrategy {
+public class MavenArtifact {
 
-    private final CamelContext camelContext;
+    private final MavenGav gav;
+    private final File file;
 
-    public DependencyDownloaderStrategy(CamelContext camelContext) {
-        this.camelContext = camelContext;
+    public MavenArtifact(MavenGav gav, File file) {
+        this.gav = gav;
+        this.file = file;
     }
 
-    @Override
-    public void onDependency(String dependency) {
-        MavenGav gav = MavenGav.parseGav(camelContext, dependency);
-        if (!DownloaderHelper.alreadyOnClasspath(camelContext, gav.getGroupId(), gav.getArtifactId(), gav.getVersion())) {
-            DownloaderHelper.downloadDependency(camelContext, gav.getGroupId(), gav.getArtifactId(),
-                    gav.getVersion());
-        }
+    public MavenGav getGav() {
+        return gav;
+    }
+
+    public File getFile() {
+        return file;
     }
 
+    @Override
+    public String toString() {
+        return gav.toString();
+    }
 }
diff --git a/dsl/camel-kamelet-main/src/main/resources/camelGrapeConfig.xml b/dsl/camel-kamelet-main/src/main/resources/camelGrapeConfig.xml
deleted file mode 100644
index 50ea1457cf6..00000000000
--- a/dsl/camel-kamelet-main/src/main/resources/camelGrapeConfig.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    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.
-
--->
-<ivysettings>
-    <!-- disable download of source and javadoc to be faster -->
-    <property name="ivy.maven.lookup.sources" value="false"/>
-    <property name="ivy.maven.lookup.javadoc" value="false"/>
-    <settings defaultResolver="downloadGrapes"/>
-    <resolvers>
-        <chain name="downloadGrapes" returnFirst="true">
-            <!-- grapes -->
-            <filesystem name="cachedGrapes">
-                <ivy pattern="${user.home}/.groovy/grapes/[organisation]/[module]/ivy-[revision].xml"/>
-                <artifact pattern="${user.home}/.groovy/grapes/[organisation]/[module]/[type]s/[artifact]-[revision](-[classifier]).[ext]"/>
-            </filesystem>
-            <!-- local m2 -->
-            <ibiblio name="localm2" root="${user.home.url}/.m2/repository/" checkmodified="true" changingPattern=".*" changingMatcher="regexp" m2compatible="true"/>
-            <!-- maven central -->
-            <ibiblio name="maven2" m2compatible="true"/>
-            <!-- apache snapshot -->
-            <ibiblio name="apacheSnapshots" root="https://repository.apache.org/snapshots" m2compatible="true" changingMatcher="regexp" changingPattern=".*SNAPSHOT.*" checkmodified="true" />
-            <!-- @repos@ -->
-        </chain>
-    </resolvers>
-</ivysettings>
diff --git a/dsl/camel-kamelet-main/src/main/resources/localGrapeConfig.xml b/dsl/camel-kamelet-main/src/main/resources/localGrapeConfig.xml
deleted file mode 100644
index cb4f490397d..00000000000
--- a/dsl/camel-kamelet-main/src/main/resources/localGrapeConfig.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    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.
-
--->
-<ivysettings>
-    <!-- disable download of source and javadoc to be faster -->
-    <property name="ivy.maven.lookup.sources" value="false"/>
-    <property name="ivy.maven.lookup.javadoc" value="false"/>
-    <settings defaultResolver="downloadGrapes"/>
-    <resolvers>
-        <chain name="downloadGrapes" returnFirst="true">
-            <!-- grapes -->
-            <filesystem name="cachedGrapes">
-                <ivy pattern="${user.home}/.groovy/grapes/[organisation]/[module]/ivy-[revision].xml"/>
-                <artifact pattern="${user.home}/.groovy/grapes/[organisation]/[module]/[type]s/[artifact]-[revision](-[classifier]).[ext]"/>
-            </filesystem>
-            <!-- local m2 -->
-            <ibiblio name="localm2" root="${user.home.url}/.m2/repository/" checkmodified="true" changingPattern=".*" changingMatcher="regexp" m2compatible="true"/>
-        </chain>
-    </resolvers>
-</ivysettings>
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java b/dsl/camel-kamelet-main/src/test/java/org/apache/camel/main/DependencyUtilTest.java
similarity index 53%
copy from dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java
copy to dsl/camel-kamelet-main/src/test/java/org/apache/camel/main/DependencyUtilTest.java
index 6287fb78577..374b17fc6ed 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DependencyDownloaderStrategy.java
+++ b/dsl/camel-kamelet-main/src/test/java/org/apache/camel/main/DependencyUtilTest.java
@@ -16,24 +16,18 @@
  */
 package org.apache.camel.main;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.spi.DependencyStrategy;
+import java.util.List;
 
-class DependencyDownloaderStrategy implements DependencyStrategy {
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
 
-    private final CamelContext camelContext;
+public class DependencyUtilTest {
 
-    public DependencyDownloaderStrategy(CamelContext camelContext) {
-        this.camelContext = camelContext;
+    @Test
+    public void testDownload() throws Exception {
+        List<String> deps = List.of("org.apache.camel:camel-core:3.17.0");
+        List<MavenArtifact> answer = DependencyUtil.resolveDependenciesViaAether(deps, null, false, false, true);
+        Assertions.assertNotNull(answer);
+        Assertions.assertTrue(answer.size() > 15);
     }
-
-    @Override
-    public void onDependency(String dependency) {
-        MavenGav gav = MavenGav.parseGav(camelContext, dependency);
-        if (!DownloaderHelper.alreadyOnClasspath(camelContext, gav.getGroupId(), gav.getArtifactId(), gav.getVersion())) {
-            DownloaderHelper.downloadDependency(camelContext, gav.getGroupId(), gav.getArtifactId(),
-                    gav.getVersion());
-        }
-    }
-
 }