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}