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 e8319bf610ce CAMEL-22671: camel-jbang - Refer to third party JAR 
versions from camel-dependencies POM (#19850)
e8319bf610ce is described below

commit e8319bf610ce0248b91f50e3a7e65aa1de369916
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Nov 7 16:44:21 2025 +0100

    CAMEL-22671: camel-jbang - Refer to third party JAR versions from 
camel-dependencies POM (#19850)
---
 .../java/org/apache/camel/main/KameletMain.java    |  2 +
 .../main/download/CamelDependenciesHelper.java     | 51 -----------------
 .../camel/main/download/DependencyDownloader.java  | 10 ++++
 .../download/KnownDependenciesVersionResolver.java | 66 ++++++++++++++++++++++
 .../main/download/MavenDependencyDownloader.java   | 35 ++++++++++--
 .../camel/main/download/VersionResolver.java       | 32 +++++++++++
 .../resources/auto-configure/camel-cxf-soap.java   |  5 +-
 .../camel-main-known-dependencies.properties       | 18 +++---
 8 files changed, 149 insertions(+), 70 deletions(-)

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 af15d05e9c44..96f6159ddf86 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
@@ -67,6 +67,7 @@ import 
org.apache.camel.main.download.KameletAutowiredLifecycleStrategy;
 import org.apache.camel.main.download.KameletMainInjector;
 import org.apache.camel.main.download.KameletOptimisedComponentResolver;
 import org.apache.camel.main.download.KnownDependenciesResolver;
+import org.apache.camel.main.download.KnownDependenciesVersionResolver;
 import org.apache.camel.main.download.KnownReposResolver;
 import org.apache.camel.main.download.MavenDependencyDownloader;
 import org.apache.camel.main.download.PackageNameSourceLoader;
@@ -769,6 +770,7 @@ public class KameletMain extends MainCommandLineSupport {
         downloader.addDownloadListener(new AutoConfigureDownloadListener());
         downloader.addArtifactDownloadListener(new 
TypeConverterLoaderDownloadListener());
         downloader.addArtifactDownloadListener(new 
BasePackageScanDownloadListener(packageScanJars));
+        downloader.setVersionResolver(new 
KnownDependenciesVersionResolver(downloader));
 
         return downloader;
     }
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/CamelDependenciesHelper.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/CamelDependenciesHelper.java
deleted file mode 100644
index bfdb82d76e03..000000000000
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/CamelDependenciesHelper.java
+++ /dev/null
@@ -1,51 +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.download;
-
-import java.io.FileInputStream;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.tooling.maven.MavenArtifact;
-import org.apache.camel.util.IOHelper;
-import org.apache.camel.util.StringHelper;
-
-public class CamelDependenciesHelper {
-
-    /**
-     * Resolve the version of a given dependency defined in the 
camel-dependencies POM file, which has a list of all the
-     * 3rd-party dependencies used by Camel components.
-     */
-    public static String dependencyVersion(CamelContext context, String key) {
-        MavenDependencyDownloader downloader = 
context.hasService(MavenDependencyDownloader.class);
-        if (downloader != null) {
-            MavenArtifact ma = downloader.downloadArtifact("org.apache.camel", 
"camel-dependencies:pom", context.getVersion());
-            if (ma != null && ma.getFile() != null) {
-                FileInputStream fis = null;
-                try {
-                    fis = new FileInputStream(ma.getFile());
-                    String text = IOHelper.loadText(fis);
-                    return StringHelper.between(text, "<" + key + ">", "</" + 
key + ">");
-                } catch (Exception e) {
-                    // ignore
-                } finally {
-                    IOHelper.close(fis);
-                }
-            }
-        }
-        return null;
-    }
-}
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java
index 597e856d28d8..d61b44a6d1a4 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java
@@ -223,4 +223,14 @@ public interface DependencyDownloader extends 
CamelContextAware, StaticService {
      */
     RepositoryResolver getRepositoryResolver();
 
+    /**
+     * Gets the {@link VersionResolver}
+     */
+    VersionResolver getVersionResolver();
+
+    /**
+     * Set {@link VersionResolver}
+     */
+    void setVersionResolver(VersionResolver versionResolver);
+
 }
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownDependenciesVersionResolver.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownDependenciesVersionResolver.java
new file mode 100644
index 000000000000..a5af17876326
--- /dev/null
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownDependenciesVersionResolver.java
@@ -0,0 +1,66 @@
+/*
+ * 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.download;
+
+import java.io.FileInputStream;
+import java.util.Properties;
+
+import org.apache.camel.main.util.VersionHelper;
+import org.apache.camel.support.service.ServiceSupport;
+import org.apache.camel.tooling.maven.MavenArtifact;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.StringHelper;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
+
+public class KnownDependenciesVersionResolver extends ServiceSupport 
implements VersionResolver {
+
+    private final DependencyDownloader downloader;
+    private Properties properties;
+
+    public KnownDependenciesVersionResolver(DependencyDownloader downloader) {
+        this.downloader = downloader;
+    }
+
+    @Override
+    protected void doInit() throws Exception {
+        super.doInit();
+
+        String version = VersionHelper.extractCamelVersion();
+        MavenArtifact ma = downloader.downloadArtifact("org.apache.camel", 
"camel-dependencies:pom", version);
+        if (ma != null && ma.getFile() != null) {
+            FileInputStream fis = null;
+            try {
+                fis = new FileInputStream(ma.getFile());
+                MavenXpp3Reader reader = new MavenXpp3Reader();
+                Model model = reader.read(fis);
+                properties = model.getProperties();
+            } finally {
+                IOHelper.close(fis);
+            }
+        }
+    }
+
+    @Override
+    public String resolve(String version) {
+        String key = StringHelper.between(version, "${", "}");
+        if (key != null && properties != null) {
+            version = properties.getProperty(key, version);
+        }
+        return version;
+    }
+}
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java
index 338f31fed69b..983ab7e185e4 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java
@@ -73,6 +73,7 @@ public class MavenDependencyDownloader extends ServiceSupport 
implements Depende
     private final Set<ArtifactDownloadListener> artifactDownloadListeners = 
new LinkedHashSet<>();
     private final Map<String, DownloadRecord> downloadRecords = new 
HashMap<>();
     private KnownReposResolver knownReposResolver;
+    private VersionResolver versionResolver;
     private boolean download = true;
 
     // all maven-resolver work is delegated to camel-tooling-maven
@@ -132,6 +133,16 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
         }
     }
 
+    @Override
+    public VersionResolver getVersionResolver() {
+        return versionResolver;
+    }
+
+    @Override
+    public void setVersionResolver(VersionResolver versionResolver) {
+        this.versionResolver = versionResolver;
+    }
+
     @Override
     public void addDownloadListener(DownloadListener downloadListener) {
         CamelContextAware.trySetCamelContext(downloadListener, 
getCamelContext());
@@ -248,6 +259,10 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
             String groupId, String artifactId, String version, boolean 
transitively,
             boolean hidden, String extraRepos) {
 
+        if (versionResolver != null && version != null) {
+            version = versionResolver.resolve(version);
+        }
+
         if (!hidden) {
             // trigger listener
             for (DownloadListener listener : downloadListeners) {
@@ -276,11 +291,12 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
         }
 
         String gav = groupId + ":" + artifactId + ":" + version;
+        String targetVersion = version;
         threadPool.download(LOG, () -> {
             List<String> deps = List.of(gav);
 
             // include Apache snapshot to make it easy to use upcoming releases
-            boolean useApacheSnapshots = "org.apache.camel".equals(groupId) && 
version.contains("SNAPSHOT");
+            boolean useApacheSnapshots = "org.apache.camel".equals(groupId) && 
targetVersion.contains("SNAPSHOT");
 
             // include extra repositories (if any) - these will be used in 
addition
             // to the ones detected from ~/.m2/settings.xml and configured in
@@ -327,7 +343,7 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
             }
             if (!artifacts.isEmpty()) {
                 for (DownloadListener listener : downloadListeners) {
-                    listener.onDownloadedDependency(groupId, artifactId, 
version);
+                    listener.onDownloadedDependency(groupId, artifactId, 
targetVersion);
                 }
             }
             if (!extraRepositories.isEmpty()) {
@@ -431,6 +447,10 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
             return true;
         }
 
+        if (versionResolver != null && version != null) {
+            version = versionResolver.resolve(version);
+        }
+
         String target = artifactId;
         if (version != null) {
             target = target + "-" + version;
@@ -564,14 +584,17 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
         if (mb != null) {
             bootClasspath = mb.getClassPath().split("[:|;]");
         }
-        ServiceHelper.initService(threadPool);
-        ServiceHelper.initService(mavenDownloader);
+        ServiceHelper.initService(versionResolver, threadPool, 
mavenDownloader);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        ServiceHelper.startService(threadPool, mavenDownloader, 
versionResolver);
     }
 
     @Override
     protected void doStop() {
-        ServiceHelper.stopAndShutdownService(mavenDownloader);
-        ServiceHelper.stopAndShutdownService(threadPool);
+        ServiceHelper.stopAndShutdownServices(versionResolver, 
mavenDownloader, threadPool);
     }
 
     public List<MavenArtifact> resolveDependenciesViaAether(
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/VersionResolver.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/VersionResolver.java
new file mode 100644
index 000000000000..077efc9c6648
--- /dev/null
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/VersionResolver.java
@@ -0,0 +1,32 @@
+/*
+ * 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.download;
+
+/**
+ * To use a custom strategy to resolve versions.
+ */
+public interface VersionResolver {
+
+    /**
+     * Resolve the given version.
+     *
+     * Placeholders for versions defined in camel-dependencies/pom.xml can be 
referred via ${xxx} syntax, such as
+     * ${cxf-version}.
+     */
+    String resolve(String version);
+
+}
diff --git 
a/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-cxf-soap.java 
b/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-cxf-soap.java
index 15d413f216fe..8b9e4508f4ca 100644
--- 
a/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-cxf-soap.java
+++ 
b/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-cxf-soap.java
@@ -17,10 +17,7 @@
 
 // check if we already have CXF transport on classpath
 org.apache.camel.main.download.MavenDependencyDownloader downloader = 
context.hasService(org.apache.camel.main.download.MavenDependencyDownloader.class);
-final var cxfVersion = 
org.apache.camel.main.download.CamelDependenciesHelper.dependencyVersion(context,
 "cxf-version");
-if (cxfVersion == null) {
-    return null;
-}
+var cxfVersion = downloader.getVersionResolver().resolve("${cxf-version}");
 boolean jetty = downloader.alreadyOnClasspath("org.apache.cxf", 
"cxf-rt-transports-http-jetty", cxfVersion);
 boolean undertow = downloader.alreadyOnClasspath("org.apache.cxf", 
"cxf-rt-transports-http-undertow", cxfVersion);
 if (jetty || undertow){
diff --git 
a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
 
b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
index 6250ed9bbe11..151f88be7a3a 100644
--- 
a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
+++ 
b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
@@ -31,15 +31,15 @@ org.eclipse.microprofile.config.inject.ConfigProperty = 
camel:microprofile-confi
 
 com.amazon.redshift.jdbc.Driver = com.amazon.redshift:redshift-jdbc42:2.1.0.33
 com.microsoft.sqlserver.jdbc.SQLServerDriver = 
com.microsoft.sqlserver:mssql-jdbc:12.10.0.jre11
-com.mysql.cj.jdbc.Driver = com.mysql:mysql-connector-j:9.4.0
+com.mysql.cj.jdbc.Driver = 
com.mysql:mysql-connector-j:${debezium-mysql-connector-version}
 net.sf.saxon.xpath.XPathFactoryImpl = camel:saxon
 org.springframework.amqp.rabbit.connection.CachingConnectionFactory = 
camel:spring-rabbitmq
-org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory = 
org.apache.activemq:artemis-jakarta-client-all:2.42.0
-org.messaginghub.pooled.jms.JmsPoolConnectionFactory = 
org.messaginghub:pooled-jms:3.1.7
-org.apache.commons.dbcp2.BasicDataSource = 
org.apache.commons:commons-dbcp2:2.13.0
-org.apache.qpid.jms.JmsConnectionFactory = 
org.apache.qpid:qpid-jms-client:2.7.0
-org.postgresql.Driver = org.postgresql:postgresql:42.7.8
-org.postgresql.ds.PGSimpleDataSource = org.postgresql:postgresql:42.7.8
+org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory = 
org.apache.activemq:artemis-jakarta-client-all:${activemq-artemis-version}
+org.messaginghub.pooled.jms.JmsPoolConnectionFactory = 
org.messaginghub:pooled-jms:${pooled-jms-version}
+org.apache.commons.dbcp2.BasicDataSource = 
org.apache.commons:commons-dbcp2:${commons-dbcp2-version}
+org.apache.qpid.jms.JmsConnectionFactory = 
org.apache.qpid:qpid-jms-client:${qpid-jms-client-version}
+org.postgresql.Driver = org.postgresql:postgresql:${pgjdbc-driver-version}
+org.postgresql.ds.PGSimpleDataSource = 
org.postgresql:postgresql:${pgjdbc-driver-version}
 org.apache.camel.component.cxf.jaxws.CxfEndpoint = camel:cxf-soap
 org.apache.camel.component.cxf.jaxrs.CxfRsEndpoint = camel:cxf-rest
 META-INF/services/org/apache/camel/restapi/openapi = camel:openapi-java
@@ -50,8 +50,8 @@ META-INF/services/org/apache/camel/cron/cron-service = 
camel:quartz
 META-INF/services/org/apache/camel/platform-http/jolokia = 
camel:camel-platform-http-jolokia
 META-INF/services/org/apache/camel/jandex-class-resolver = camel:jandex
 META-INF/services/org/apache/camel/groovy-script-compiler = camel:groovy
-org.apache.camel.component.activemq.ActiveMQComponent\:embedded\=true = 
org.apache.activemq:activemq-broker:5.19.0
-org.apache.camel.component.activemq6.ActiveMQComponent\:embedded\=true = 
org.apache.activemq:activemq-broker:6.1.7
+org.apache.camel.component.activemq.ActiveMQComponent\:embedded\=true = 
org.apache.activemq:activemq-broker:${activemq-version}
+org.apache.camel.component.activemq6.ActiveMQComponent\:embedded\=true = 
org.apache.activemq:activemq-broker:${activemq6-version}
 spring.datasource.url = 
org.springframework.boot:spring-boot-starter-jdbc:${spring-boot-version}
 quarkus.datasource.db-kind\=db2 = 
io.quarkus:quarkus-jdbc-db2:${quarkus-version}
 quarkus.datasource.db-kind\=derby = 
io.quarkus:quarkus-jdbc-derby:${quarkus-version}

Reply via email to