This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch vr in repository https://gitbox.apache.org/repos/asf/camel.git
commit 07a3275d4968ee5186b9945b69b88dbb2f6633cf Author: Claus Ibsen <[email protected]> AuthorDate: Fri Nov 7 14:43:58 2025 +0100 CAMEL-22671: camel-jbang - Refer to third party JAR versions from camel-dependencies POM --- .../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}
