This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch feature/CAMEL-22616-cluster-config
in repository https://gitbox.apache.org/repos/asf/camel.git

commit ed64c130a21a0feb9b9ff70b99ba02c8e664ac19
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Jul 6 17:00:28 2026 +0200

    CAMEL-22616: camel-jbang - Auto-download cluster service dependencies
    
    Co-Authored-By: Claude <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../META-INF/camel-main-configuration-metadata.json      |  6 ++++++
 core/camel-main/src/main/docs/main.adoc                  | 16 +++++++++++-----
 .../camel-factoryfinder-known-dependencies.properties    |  6 ++++++
 .../resources/camel-main-known-dependencies.properties   |  6 ++++++
 .../camel/maven/packaging/PrepareCamelMainMojo.java      | 14 --------------
 5 files changed, 29 insertions(+), 19 deletions(-)

diff --git 
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
 
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index ca9332ad5c6f..034183e3dda7 100644
--- 
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ 
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -168,6 +168,7 @@
     { "name": "camel.main.yamlDslCompactNotationWarn", "required": false, 
"description": "Whether to log a WARN when YAML DSL routes use compact 
(shorthand) notation instead of the canonical (explicit\/normalized) form. The 
canonical style is recommended as it is more tooling and AI friendly. Use Camel 
CLI to normalize existing routes: camel validate normalize &lt;file&gt;", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"boolean", "javaType": "boolean", "d [...]
     { "name": "camel.cluster.consul.aclToken", "required": false, 
"description": "Sets the ACL token to be used with Consul", "sourceType": 
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type": 
"string", "javaType": "java.lang.String", "secret": true, "security": "secret" 
},
     { "name": "camel.cluster.consul.blockSeconds", "required": false, 
"description": "The second to wait for a watch event, default 10 seconds", 
"sourceType": "org.apache.camel.component.consul.cluster.ConsulClusterService", 
"type": "integer", "javaType": "int", "defaultValue": 10, "secret": false },
+    { "name": "camel.cluster.consul.configuration", "required": false, 
"description": "To use an existing configuration", "sourceType": 
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type": 
"object", "javaType": 
"org.apache.camel.component.consul.cluster.ConsulClusterConfiguration", 
"secret": false },
     { "name": "camel.cluster.consul.connectTimeout", "required": false, 
"description": "Connect timeout in millis", "sourceType": 
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type": 
"integer", "javaType": "int", "secret": false },
     { "name": "camel.cluster.consul.datacenter", "required": false, 
"description": "The data center", "sourceType": 
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type": 
"string", "javaType": "java.lang.String", "secret": false },
     { "name": "camel.cluster.consul.enabled", "required": false, 
"description": "Whether to enable this cluster service.", "sourceType": 
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type": 
"boolean", "javaType": "boolean", "defaultValue": true, "secret": false },
@@ -193,6 +194,8 @@
     { "name": "camel.cluster.file.heartbeatTimeoutMultiplier", "required": 
false, "description": "Multiplier applied to the cluster leader 
acquireLockInterval to determine how long followers should wait before 
considering the leader stale. For example, if the leader updates its heartbeat 
every 2 seconds and the heartbeatTimeoutMultiplier is 3, followers will 
tolerate up to 2s * 3 = 6s of silence before declaring the leader 
unavailable.", "sourceType": "org.apache.camel.component.file.clu [...]
     { "name": "camel.cluster.file.root", "required": true, "description": "The 
root file path", "sourceType": 
"org.apache.camel.component.file.cluster.FileLockClusterService", "type": 
"string", "javaType": "java.lang.String", "secret": false },
     { "name": "camel.cluster.infinispan.cacheContainer", "required": false, 
"description": "Specifies the cache Container to connect", "sourceType": 
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
 "type": "object", "javaType": 
"org.infinispan.client.hotrod.RemoteCacheManager", "secret": false },
+    { "name": "camel.cluster.infinispan.cacheContainerConfiguration", 
"required": false, "description": "The CacheContainer configuration. Used if 
the cacheContainer is not defined.", "sourceType": 
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
 "type": "object", "javaType": 
"org.infinispan.client.hotrod.configuration.Configuration", "secret": false },
+    { "name": "camel.cluster.infinispan.configuration", "required": false, 
"description": "To use an existing configuration", "sourceType": 
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
 "type": "object", "javaType": 
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterConfiguration",
 "secret": false },
     { "name": "camel.cluster.infinispan.configurationProperties", "required": 
false, "description": "Implementation specific properties for the 
CacheManager", "sourceType": 
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
 "type": "object", "javaType": "java.util.Map", "secret": false },
     { "name": "camel.cluster.infinispan.configurationUri", "required": false, 
"description": "An implementation specific URI for the CacheManager", 
"sourceType": 
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
 "type": "string", "javaType": "java.lang.String", "secret": false },
     { "name": "camel.cluster.infinispan.enabled", "required": false, 
"description": "Whether to enable this cluster service.", "sourceType": 
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
 "type": "boolean", "javaType": "boolean", "defaultValue": true, "secret": 
false },
@@ -210,7 +213,9 @@
     { "name": "camel.cluster.jgroups-raft.id", "required": true, 
"description": "Unique Raft id", "sourceType": 
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService", 
"type": "string", "javaType": "java.lang.String", "secret": false },
     { "name": "camel.cluster.jgroups-raft.jgroupsClusterName", "required": 
false, "description": "The name of the cluster", "sourceType": 
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService", 
"type": "string", "javaType": "java.lang.String", "defaultValue": 
"jgroupsraft-master", "secret": false },
     { "name": "camel.cluster.jgroups-raft.jgroupsConfig", "required": false, 
"description": "The path to the JGroups Raft configuration", "sourceType": 
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService", 
"type": "string", "javaType": "java.lang.String", "defaultValue": "raft.xml", 
"secret": false },
+    { "name": "camel.cluster.jgroups-raft.raftHandle", "required": false, 
"description": "To use a custom RaftHandler", "sourceType": 
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService", 
"type": "object", "javaType": "org.jgroups.raft.RaftHandle", "secret": false },
     { "name": "camel.cluster.kubernetes.clusterLabels", "required": false, 
"description": "Labels used to identify the members of the cluster.", 
"sourceType": 
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService", 
"type": "object", "javaType": "java.util.Map", "secret": false, "deprecated": 
true },
+    { "name": "camel.cluster.kubernetes.configuration", "required": false, 
"description": "To use an existing configuration for Kubernetes", "sourceType": 
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService", 
"type": "object", "javaType": 
"org.apache.camel.component.kubernetes.KubernetesConfiguration", "secret": 
false, "deprecated": true },
     { "name": "camel.cluster.kubernetes.connectionTimeout", "required": false, 
"description": "Connection timeout in milliseconds to use when making requests 
to the Kubernetes API server.", "sourceType": 
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService", 
"type": "integer", "javaType": "java.lang.Integer", "secret": false, 
"deprecated": true },
     { "name": "camel.cluster.kubernetes.enabled", "required": false, 
"description": "Whether to enable this cluster service.", "sourceType": 
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService", 
"type": "boolean", "javaType": "boolean", "defaultValue": true, "secret": false 
},
     { "name": "camel.cluster.kubernetes.groupName", "required": false, 
"description": "Name of the lock group (or namespace according to the Camel 
cluster convention) within the chosen ConfigMap.", "sourceType": 
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService", 
"type": "string", "javaType": "java.lang.String", "secret": false, 
"deprecated": true },
@@ -234,6 +239,7 @@
     { "name": "camel.cluster.zookeeper.reconnectBaseSleepTime", "required": 
false, "description": "Initial amount of time (millis) to wait between 
retries", "sourceType": 
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type": 
"integer", "javaType": "long", "defaultValue": 1000, "secret": false },
     { "name": "camel.cluster.zookeeper.reconnectMaxRetries", "required": 
false, "description": "Max number of times to retry", "sourceType": 
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type": 
"integer", "javaType": "int", "defaultValue": 3, "secret": false },
     { "name": "camel.cluster.zookeeper.reconnectMaxSleepTime", "required": 
false, "description": "Max time (millis) to sleep on each retry", "sourceType": 
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type": 
"integer", "javaType": "long", "secret": false },
+    { "name": "camel.cluster.zookeeper.retryPolicy", "required": false, 
"description": "To use a custom retry policy implementation", "sourceType": 
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type": 
"object", "javaType": "org.apache.curator.RetryPolicy", "secret": false },
     { "name": "camel.cluster.zookeeper.sessionTimeout", "required": false, 
"description": "Session timeout (millis)", "sourceType": 
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type": 
"integer", "javaType": "long", "defaultValue": 60000, "secret": false },
     { "name": "camel.debug.bodyIncludeFiles", "required": false, 
"description": "Whether to include the message body of file based messages. The 
overhead is that the file content has to be read from the file.", "sourceType": 
"org.apache.camel.main.DebuggerConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": true, "secret": false },
     { "name": "camel.debug.bodyIncludeStreams", "required": false, 
"description": "Whether to include the message body of stream based messages. 
If enabled then beware the stream may not be re-readable later. See more about 
Stream Caching.", "sourceType": 
"org.apache.camel.main.DebuggerConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": false, "secret": false },
diff --git a/core/camel-main/src/main/docs/main.adoc 
b/core/camel-main/src/main/docs/main.adoc
index c2b0aa4f4576..20d29d34c351 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -756,12 +756,13 @@ The camel.cluster.file supports 10 options, which are 
listed below.
 
 
 === Camel Kubernetes Cluster Service configurations
-The camel.cluster.kubernetes supports 14 options, which are listed below.
+The camel.cluster.kubernetes supports 15 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
 | *camel.cluster.kubernetes.clusterLabels* | Labels used to identify the 
members of the cluster. |  | Map
+| *camel.cluster.kubernetes.configuration* | To use an existing configuration 
for Kubernetes |  | KubernetesConfiguration
 | *camel.cluster.kubernetes.connectionTimeout* | Connection timeout in 
milliseconds to use when making requests to the Kubernetes API server. |  | 
Integer
 | *camel.cluster.kubernetes.enabled* | Whether to enable this cluster service. 
| true | boolean
 | *camel.cluster.kubernetes.groupName* | Name of the lock group (or namespace 
according to the Camel cluster convention) within the chosen ConfigMap. |  | 
String
@@ -779,7 +780,7 @@ The camel.cluster.kubernetes supports 14 options, which are 
listed below.
 
 
 === Camel ZooKeeper Cluster Service configurations
-The camel.cluster.zookeeper supports 11 options, which are listed below.
+The camel.cluster.zookeeper supports 12 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -794,18 +795,20 @@ The camel.cluster.zookeeper supports 11 options, which 
are listed below.
 | *camel.cluster.zookeeper.reconnectBaseSleepTime* | Initial amount of time 
(millis) to wait between retries | 1000 | long
 | *camel.cluster.zookeeper.reconnectMaxRetries* | Max number of times to retry 
| 3 | int
 | *camel.cluster.zookeeper.reconnectMaxSleepTime* | Max time (millis) to sleep 
on each retry |  | long
+| *camel.cluster.zookeeper.retryPolicy* | To use a custom retry policy 
implementation |  | RetryPolicy
 | *camel.cluster.zookeeper.sessionTimeout* | Session timeout (millis) | 60000 
| long
 |===
 
 
 === Camel Consul Cluster Service configurations
-The camel.cluster.consul supports 16 options, which are listed below.
+The camel.cluster.consul supports 17 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
 | *camel.cluster.consul.aclToken* | Sets the ACL token to be used with Consul 
|  | String
 | *camel.cluster.consul.blockSeconds* | The second to wait for a watch event, 
default 10 seconds | 10 | int
+| *camel.cluster.consul.configuration* | To use an existing configuration |  | 
ConsulClusterConfiguration
 | *camel.cluster.consul.connectTimeout* | Connect timeout in millis |  | int
 | *camel.cluster.consul.datacenter* | The data center |  | String
 | *camel.cluster.consul.enabled* | Whether to enable this cluster service. | 
true | boolean
@@ -824,7 +827,7 @@ The camel.cluster.consul supports 16 options, which are 
listed below.
 
 
 === Camel JGroups Raft Cluster Service configurations
-The camel.cluster.jgroups-raft supports 4 options, which are listed below.
+The camel.cluster.jgroups-raft supports 5 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -833,16 +836,19 @@ The camel.cluster.jgroups-raft supports 4 options, which 
are listed below.
 | *camel.cluster.jgroups-raft.id* | Unique Raft id |  | String
 | *camel.cluster.jgroups-raft.jgroupsClusterName* | The name of the cluster | 
jgroupsraft-master | String
 | *camel.cluster.jgroups-raft.jgroupsConfig* | The path to the JGroups Raft 
configuration | raft.xml | String
+| *camel.cluster.jgroups-raft.raftHandle* | To use a custom RaftHandler |  | 
RaftHandle
 |===
 
 
 === Camel Infinispan Remote Cluster Service configurations
-The camel.cluster.infinispan supports 14 options, which are listed below.
+The camel.cluster.infinispan supports 16 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
 | *camel.cluster.infinispan.cacheContainer* | Specifies the cache Container to 
connect |  | RemoteCacheManager
+| *camel.cluster.infinispan.cacheContainerConfiguration* | The CacheContainer 
configuration. Used if the cacheContainer is not defined. |  | Configuration
+| *camel.cluster.infinispan.configuration* | To use an existing configuration 
|  | InfinispanRemoteClusterConfiguration
 | *camel.cluster.infinispan.configurationProperties* | Implementation specific 
properties for the CacheManager |  | Map
 | *camel.cluster.infinispan.configurationUri* | An implementation specific URI 
for the CacheManager |  | String
 | *camel.cluster.infinispan.enabled* | Whether to enable this cluster service. 
| true | boolean
diff --git 
a/dsl/camel-kamelet-main/src/generated/resources/camel-factoryfinder-known-dependencies.properties
 
b/dsl/camel-kamelet-main/src/generated/resources/camel-factoryfinder-known-dependencies.properties
index 4b6ae8f81790..d21021382017 100644
--- 
a/dsl/camel-kamelet-main/src/generated/resources/camel-factoryfinder-known-dependencies.properties
+++ 
b/dsl/camel-kamelet-main/src/generated/resources/camel-factoryfinder-known-dependencies.properties
@@ -17,6 +17,12 @@
 
 META-INF/services/org/apache/camel/bean-processor-factory=camel:bean
 META-INF/services/org/apache/camel/bean-proxy-factory=camel:bean
+META-INF/services/org/apache/camel/cluster-service-consul=camel:consul
+META-INF/services/org/apache/camel/cluster-service-file=camel:file
+META-INF/services/org/apache/camel/cluster-service-infinispan=camel:infinispan
+META-INF/services/org/apache/camel/cluster-service-jgroups-raft=camel:jgroups-raft
+META-INF/services/org/apache/camel/cluster-service-kubernetes=camel:kubernetes
+META-INF/services/org/apache/camel/cluster-service-zookeeper=camel:zookeeper
 META-INF/services/org/apache/camel/csimple-compiler=camel:csimple-joor
 META-INF/services/org/apache/camel/debugger-factory=camel:debug
 META-INF/services/org/apache/camel/file-adapter-factory=camel:file
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 ac4afe0e433b..70730cfcc430 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
@@ -44,6 +44,12 @@ camel.opentelemetry = camel:opentelemetry
 camel.opentelemetry2 = camel:opentelemetry2
 camel.lra = camel:lra
 camel.telemetryDev = camel:telemetry-dev
+camel.cluster.file = camel:file
+camel.cluster.kubernetes = camel:kubernetes
+camel.cluster.zookeeper = camel:zookeeper
+camel.cluster.consul = camel:consul
+camel.cluster.jgroups-raft = camel:jgroups-raft
+camel.cluster.infinispan = camel:infinispan
 
 META-INF/services/org/apache/camel/modelxml-dumper = camel:xml-io
 META-INF/services/org/apache/camel/modelyaml-dumper = camel:yaml-io
diff --git 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
index 259740416d85..df0651404763 100644
--- 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
@@ -23,7 +23,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.stream.Collectors;
 
 import javax.inject.Inject;
@@ -155,13 +154,6 @@ public class PrepareCamelMainMojo extends 
AbstractGeneratorMojo {
         return answer;
     }
 
-    private static final Set<String> SETTABLE_JAVA_TYPES = Set.of(
-            "java.lang.String", "java.lang.Integer", "java.lang.Long", 
"java.lang.Boolean",
-            "java.lang.Double", "java.lang.Float", "java.lang.Short", 
"java.lang.Byte",
-            "int", "long", "boolean", "double", "float", "short", "byte",
-            "java.util.Map", "java.util.concurrent.TimeUnit",
-            "org.apache.camel.support.jsse.SSLContextParameters");
-
     /**
      * Loads cluster service configuration metadata from a bean JSON file.
      */
@@ -194,12 +186,6 @@ public class PrepareCamelMainMojo extends 
AbstractGeneratorMojo {
                 JsonObject prop = (JsonObject) entry.getValue();
 
                 String javaType = prop.getString("javaType");
-                String label = prop.getString("label");
-
-                // skip advanced properties with component-specific types
-                if (label != null && label.contains("advanced") && 
!SETTABLE_JAVA_TYPES.contains(javaType)) {
-                    continue;
-                }
 
                 MainModel.MainOptionModel model = new 
MainModel.MainOptionModel();
                 model.setName(prefix + name);

Reply via email to