diff --git a/bom/application/pom.xml b/bom/application/pom.xml
index 0009f0d257a07..ca6e24b5fcfc0 100644
--- a/bom/application/pom.xml
+++ b/bom/application/pom.xml
@@ -48,7 +48,7 @@
2.04.0.22.8.0
- 3.10.1
+ 3.10.24.1.04.0.04.0.3
@@ -89,7 +89,7 @@
23.1.21.8.0
- 2.18.1
+ 2.18.21.0.0.Final3.17.01.17.1
@@ -3463,6 +3463,11 @@
bcutil-jdk18on${bouncycastle.version}
+
+ org.bouncycastle
+ bcpg-jdk18on
+ ${bouncycastle.version}
+ org.bouncycastlebc-fips
diff --git a/core/deployment/src/main/java/io/quarkus/deployment/ExtensionLoader.java b/core/deployment/src/main/java/io/quarkus/deployment/ExtensionLoader.java
index 963027bc89c1b..a65691e60b8da 100644
--- a/core/deployment/src/main/java/io/quarkus/deployment/ExtensionLoader.java
+++ b/core/deployment/src/main/java/io/quarkus/deployment/ExtensionLoader.java
@@ -182,7 +182,7 @@ public String getId() {
}
// ConfigMapping
- ConfigClass mapping = readResult.getAllMappings().get(entry.getKey());
+ ConfigClass mapping = readResult.getAllMappingsByClass().get(entry.getKey());
if (mapping != null) {
mappingClasses.put(entry.getValue(), mapping);
continue;
diff --git a/core/deployment/src/main/java/io/quarkus/deployment/builditem/nativeimage/ReflectiveClassBuildItem.java b/core/deployment/src/main/java/io/quarkus/deployment/builditem/nativeimage/ReflectiveClassBuildItem.java
index ca4b0e37c7fdf..a4cfd392230e3 100644
--- a/core/deployment/src/main/java/io/quarkus/deployment/builditem/nativeimage/ReflectiveClassBuildItem.java
+++ b/core/deployment/src/main/java/io/quarkus/deployment/builditem/nativeimage/ReflectiveClassBuildItem.java
@@ -307,7 +307,7 @@ public Builder classes(boolean classes) {
}
public Builder classes() {
- return fields(true);
+ return classes(true);
}
/**
diff --git a/core/deployment/src/main/java/io/quarkus/deployment/configuration/BuildTimeConfigurationReader.java b/core/deployment/src/main/java/io/quarkus/deployment/configuration/BuildTimeConfigurationReader.java
index b160e70246a94..3b875da246b2a 100644
--- a/core/deployment/src/main/java/io/quarkus/deployment/configuration/BuildTimeConfigurationReader.java
+++ b/core/deployment/src/main/java/io/quarkus/deployment/configuration/BuildTimeConfigurationReader.java
@@ -21,6 +21,7 @@
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -628,9 +629,9 @@ ReadResult run() {
objectsByClass.put(mapping.getKlass(), config.getConfigMapping(mapping.getKlass(), mapping.getPrefix()));
}
- Set buildTimeNames = getMappingsNames(buildTimeMappings);
- Set buildTimeRunTimeNames = getMappingsNames(buildTimeRunTimeMappings);
- Set runTimeNames = getMappingsNames(runTimeMappings);
+ Set buildTimeNames = mappingsToNames(buildTimeMappings).keySet();
+ Set buildTimeRunTimeNames = mappingsToNames(buildTimeRunTimeMappings).keySet();
+ Set runTimeNames = mappingsToNames(runTimeMappings).keySet();
for (String property : allProperties) {
PropertyName name = new PropertyName(property);
if (buildTimeNames.contains(name)) {
@@ -1222,12 +1223,27 @@ private static void getDefaults(
}
}
- private static Set getMappingsNames(final List configMappings) {
+ private static Map mappingsToNames(final List configMappings) {
Set names = new HashSet<>();
for (ConfigClass configMapping : configMappings) {
names.addAll(ConfigMappings.getProperties(configMapping).keySet());
}
- return PropertiesUtil.toPropertyNames(names);
+ Map propertyNames = new HashMap<>();
+ for (String name : names) {
+ PropertyName propertyName = new PropertyName(name);
+ if (propertyNames.containsKey(propertyName)) {
+ List duplicates = new ArrayList<>();
+ duplicates.add(name);
+ while (propertyNames.containsKey(propertyName)) {
+ duplicates.add(propertyNames.remove(propertyName));
+ }
+ String minName = Collections.min(duplicates, Comparator.comparingInt(String::length));
+ propertyNames.put(new PropertyName(minName), minName);
+ } else {
+ propertyNames.put(propertyName, name);
+ }
+ }
+ return propertyNames;
}
}
@@ -1249,7 +1265,9 @@ public static final class ReadResult {
final List buildTimeMappings;
final List buildTimeRunTimeMappings;
final List runTimeMappings;
- final Map, ConfigClass> allMappings;
+ final List allMappings;
+ final Map, ConfigClass> allMappingsByClass;
+ final Map allMappingsNames;
final Set unknownBuildProperties;
final Set deprecatedRuntimeProperties;
@@ -1273,7 +1291,9 @@ public ReadResult(final Builder builder) {
this.buildTimeMappings = builder.getBuildTimeMappings();
this.buildTimeRunTimeMappings = builder.getBuildTimeRunTimeMappings();
this.runTimeMappings = builder.getRunTimeMappings();
- this.allMappings = mappingsToMap(builder);
+ this.allMappings = new ArrayList<>(mappingsToMap(builder).values());
+ this.allMappingsByClass = mappingsToMap(builder);
+ this.allMappingsNames = ReadOperation.mappingsToNames(allMappings);
this.unknownBuildProperties = builder.getUnknownBuildProperties();
this.deprecatedRuntimeProperties = builder.deprecatedRuntimeProperties;
@@ -1355,10 +1375,18 @@ public List getRunTimeMappings() {
return runTimeMappings;
}
- public Map, ConfigClass> getAllMappings() {
+ public List getAllMappings() {
return allMappings;
}
+ public Map, ConfigClass> getAllMappingsByClass() {
+ return allMappingsByClass;
+ }
+
+ public Map getAllMappingsNames() {
+ return allMappingsNames;
+ }
+
public Set getUnknownBuildProperties() {
return unknownBuildProperties;
}
diff --git a/core/deployment/src/main/java/io/quarkus/deployment/configuration/RunTimeConfigurationGenerator.java b/core/deployment/src/main/java/io/quarkus/deployment/configuration/RunTimeConfigurationGenerator.java
index 0d8e72863855b..1df607c7ba24e 100644
--- a/core/deployment/src/main/java/io/quarkus/deployment/configuration/RunTimeConfigurationGenerator.java
+++ b/core/deployment/src/main/java/io/quarkus/deployment/configuration/RunTimeConfigurationGenerator.java
@@ -6,6 +6,7 @@
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
+import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -63,6 +64,7 @@
import io.quarkus.runtime.configuration.NameIterator;
import io.quarkus.runtime.configuration.PropertiesUtil;
import io.quarkus.runtime.configuration.QuarkusConfigFactory;
+import io.smallrye.config.ConfigMappingInterface;
import io.smallrye.config.ConfigMappings;
import io.smallrye.config.ConfigMappings.ConfigClass;
import io.smallrye.config.Converters;
@@ -88,9 +90,6 @@ public final class RunTimeConfigurationGenerator {
public static final MethodDescriptor C_READ_CONFIG = MethodDescriptor.ofMethod(CONFIG_CLASS_NAME, "readConfig", void.class);
static final FieldDescriptor C_MAPPED_PROPERTIES = FieldDescriptor.of(CONFIG_CLASS_NAME, "mappedProperties", Set.class);
- static final MethodDescriptor C_GENERATE_MAPPED_PROPERTIES = MethodDescriptor.ofMethod(CONFIG_CLASS_NAME,
- "generateMappedProperties", Set.class);
- static final MethodDescriptor PN_NEW = MethodDescriptor.ofConstructor(PropertyName.class, String.class);
static final FieldDescriptor C_UNKNOWN = FieldDescriptor.of(CONFIG_CLASS_NAME, "unknown", Set.class);
static final FieldDescriptor C_UNKNOWN_RUNTIME = FieldDescriptor.of(CONFIG_CLASS_NAME, "unknownRuntime", Set.class);
@@ -192,9 +191,13 @@ public final class RunTimeConfigurationGenerator {
static final MethodDescriptor PU_IS_PROPERTY_IN_ROOTS = MethodDescriptor.ofMethod(PropertiesUtil.class, "isPropertyInRoots",
boolean.class, String.class, Set.class);
static final MethodDescriptor HS_NEW = MethodDescriptor.ofConstructor(HashSet.class);
+ static final MethodDescriptor HS_NEW_SIZED = MethodDescriptor.ofConstructor(HashSet.class, int.class);
static final MethodDescriptor HS_ADD = MethodDescriptor.ofMethod(HashSet.class, "add", boolean.class, Object.class);
+ static final MethodDescriptor HS_ADD_ALL = MethodDescriptor.ofMethod(HashSet.class, "addAll", boolean.class,
+ Collection.class);
static final MethodDescriptor HS_CONTAINS = MethodDescriptor.ofMethod(HashSet.class, "contains", boolean.class,
Object.class);
+ static final MethodDescriptor PN_NEW = MethodDescriptor.ofConstructor(PropertyName.class, String.class);
// todo: more space-efficient sorted map impl
static final MethodDescriptor TM_NEW = MethodDescriptor.ofConstructor(TreeMap.class);
@@ -262,7 +265,6 @@ public static final class GenerateOperation implements AutoCloseable {
roots = Assert.checkNotNullParam("builder.roots", builder.getBuildTimeReadResult().getAllRoots());
additionalTypes = Assert.checkNotNullParam("additionalTypes", builder.getAdditionalTypes());
cc = ClassCreator.builder().classOutput(classOutput).className(CONFIG_CLASS_NAME).setFinal(true).build();
- generateMappedProperties();
generateEmptyParsers();
// not instantiable
try (MethodCreator mc = cc.getMethodCreator(MethodDescriptor.ofConstructor(CONFIG_CLASS_NAME))) {
@@ -282,7 +284,8 @@ public static final class GenerateOperation implements AutoCloseable {
clinit.setModifiers(Opcodes.ACC_STATIC);
cc.getFieldCreator(C_MAPPED_PROPERTIES).setModifiers(Opcodes.ACC_STATIC);
- clinit.writeStaticField(C_MAPPED_PROPERTIES, clinit.invokeStaticMethod(C_GENERATE_MAPPED_PROPERTIES));
+ clinit.writeStaticField(C_MAPPED_PROPERTIES, clinit.newInstance(HS_NEW_SIZED,
+ clinit.load((int) ((float) buildTimeConfigResult.getAllMappingsNames().size() / 0.75f + 1.0f))));
cc.getFieldCreator(C_UNKNOWN).setModifiers(Opcodes.ACC_STATIC);
clinit.writeStaticField(C_UNKNOWN, clinit.newInstance(HS_NEW));
@@ -290,6 +293,8 @@ public static final class GenerateOperation implements AutoCloseable {
cc.getFieldCreator(C_UNKNOWN_RUNTIME).setModifiers(Opcodes.ACC_STATIC);
clinit.writeStaticField(C_UNKNOWN_RUNTIME, clinit.newInstance(HS_NEW));
+ generateMappedProperties();
+
clinitNameBuilder = clinit.newInstance(SB_NEW);
// the build time config, which is for user use only (not used by us other than for loading converters)
@@ -1181,26 +1186,32 @@ private FieldDescriptor getOrCreateConverterInstance(Field field, ConverterType
}
private void generateMappedProperties() {
- Set names = new HashSet<>();
- for (ConfigClass buildTimeMapping : buildTimeConfigResult.getBuildTimeMappings()) {
- names.addAll(ConfigMappings.getProperties(buildTimeMapping).keySet());
- }
- for (ConfigClass staticConfigMapping : buildTimeConfigResult.getBuildTimeRunTimeMappings()) {
- names.addAll(ConfigMappings.getProperties(staticConfigMapping).keySet());
- }
- for (ConfigClass runtimeConfigMapping : buildTimeConfigResult.getRunTimeMappings()) {
- names.addAll(ConfigMappings.getProperties(runtimeConfigMapping).keySet());
+ MethodDescriptor method = MethodDescriptor.ofMethod(CONFIG_CLASS_NAME, "addMappedProperties", void.class);
+ MethodCreator mc = cc.getMethodCreator(method);
+ mc.setModifiers(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC);
+ for (ConfigClass mapping : buildTimeConfigResult.getAllMappings()) {
+ mc.invokeStaticMethod(generateMappedProperties(mapping, buildTimeConfigResult.getAllMappingsNames()));
}
- Set propertyNames = PropertiesUtil.toPropertyNames(names);
+ mc.returnVoid();
+ mc.close();
+ clinit.invokeStaticMethod(method);
+ }
- MethodCreator mc = cc.getMethodCreator(C_GENERATE_MAPPED_PROPERTIES);
+ private MethodDescriptor generateMappedProperties(final ConfigClass mapping,
+ final Map propertyNames) {
+ MethodDescriptor method = MethodDescriptor.ofMethod(CONFIG_CLASS_NAME,
+ "addMappedProperties$" + mapping.getKlass().getName().replace('.', '$'), void.class);
+ MethodCreator mc = cc.getMethodCreator(method);
mc.setModifiers(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC);
- ResultHandle set = mc.newInstance(HS_NEW);
- for (PropertyName propertyName : propertyNames) {
- mc.invokeVirtualMethod(HS_ADD, set, mc.newInstance(PN_NEW, mc.load(propertyName.getName())));
+ Map properties = ConfigMappings.getProperties(mapping);
+ ResultHandle set = mc.readStaticField(C_MAPPED_PROPERTIES);
+ for (String propertyName : properties.keySet()) {
+ String name = propertyNames.get(new PropertyName(propertyName));
+ mc.invokeVirtualMethod(HS_ADD, set, mc.newInstance(PN_NEW, mc.load(name)));
}
- mc.returnValue(set);
+ mc.returnVoid();
mc.close();
+ return method;
}
private void reportUnknown(BytecodeCreator bc, ResultHandle unknownProperty) {
diff --git a/core/deployment/src/main/java/io/quarkus/deployment/logging/LoggingResourceProcessor.java b/core/deployment/src/main/java/io/quarkus/deployment/logging/LoggingResourceProcessor.java
index 8507399dea96c..b51be9c405304 100644
--- a/core/deployment/src/main/java/io/quarkus/deployment/logging/LoggingResourceProcessor.java
+++ b/core/deployment/src/main/java/io/quarkus/deployment/logging/LoggingResourceProcessor.java
@@ -449,7 +449,7 @@ public void accept(LogRecord logRecord, Consumer logRecordConsumer) {
Object[] np = p != null ? Arrays.copyOf(p, p.length + 1) : new Object[1];
np[np.length - 1] = decoratedString;
elr.setParameters(np);
- elr.setMessage(elr.getMessage() + "\n\n%" + (np.length - 1) + "$s",
+ elr.setMessage(elr.getMessage() + "\n\n%" + np.length + "$s",
ExtLogRecord.FormatStyle.PRINTF);
}
case NO_FORMAT -> {
diff --git a/core/devmode-spi/src/main/java/io/quarkus/dev/console/QuarkusConsole.java b/core/devmode-spi/src/main/java/io/quarkus/dev/console/QuarkusConsole.java
index a659d4324287b..bbe0896ef5a74 100644
--- a/core/devmode-spi/src/main/java/io/quarkus/dev/console/QuarkusConsole.java
+++ b/core/devmode-spi/src/main/java/io/quarkus/dev/console/QuarkusConsole.java
@@ -104,7 +104,17 @@ public synchronized static void uninstallRedirects() {
redirectsInstalled = false;
}
+ private static void checkAndSetJdkConsole() {
+ // the JLine console in JDK 23+ causes significant startup slowdown,
+ // so we avoid it unless the user opted into it
+ String res = System.getProperty("jdk.console");
+ if (res == null) {
+ System.setProperty("jdk.console", "java.base");
+ }
+ }
+
public static boolean hasColorSupport() {
+ checkAndSetJdkConsole();
if (Boolean.getBoolean(FORCE_COLOR_SUPPORT)) {
return true; //assume the IDE run window has color support
}
diff --git a/core/runtime/src/main/java/io/quarkus/runtime/configuration/PropertiesUtil.java b/core/runtime/src/main/java/io/quarkus/runtime/configuration/PropertiesUtil.java
index 18978d1714028..7c51a8707538e 100644
--- a/core/runtime/src/main/java/io/quarkus/runtime/configuration/PropertiesUtil.java
+++ b/core/runtime/src/main/java/io/quarkus/runtime/configuration/PropertiesUtil.java
@@ -1,11 +1,7 @@
package io.quarkus.runtime.configuration;
-import java.util.HashMap;
-import java.util.Map;
import java.util.Set;
-import io.smallrye.config.PropertyName;
-
public class PropertiesUtil {
private PropertiesUtil() {
throw new IllegalStateException("Utility class");
@@ -48,28 +44,4 @@ public static boolean isPropertyInRoot(final String property, final String root)
public static boolean isPropertyQuarkusCompoundName(NameIterator propertyName) {
return propertyName.getName().startsWith("\"quarkus.");
}
-
- public static Set toPropertyNames(final Set names) {
- Map propertyNames = new HashMap<>();
- for (String name : names) {
- PropertyName propertyName = new PropertyName(name);
- if (propertyNames.containsKey(propertyName)) {
- String existing = propertyNames.remove(propertyName);
- if (existing.length() < name.length()) {
- propertyNames.put(new PropertyName(existing), existing);
- } else if (existing.length() > name.length()) {
- propertyNames.put(propertyName, name);
- } else {
- if (existing.indexOf('*') <= name.indexOf('*')) {
- propertyNames.put(new PropertyName(existing), existing);
- } else {
- propertyNames.put(propertyName, name);
- }
- }
- } else {
- propertyNames.put(propertyName, name);
- }
- }
- return propertyNames.keySet();
- }
}
diff --git a/devtools/gradle/gradle/libs.versions.toml b/devtools/gradle/gradle/libs.versions.toml
index dfa6847e072e1..e4b86cbd74791 100644
--- a/devtools/gradle/gradle/libs.versions.toml
+++ b/devtools/gradle/gradle/libs.versions.toml
@@ -3,7 +3,7 @@ plugin-publish = "1.3.0"
# updating Kotlin here makes QuarkusPluginTest > shouldNotFailOnProjectDependenciesWithoutMain(Path) fail
kotlin = "2.0.21"
-smallrye-config = "3.10.1"
+smallrye-config = "3.10.2"
junit5 = "5.10.5"
assertj = "3.26.3"
diff --git a/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc b/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc
index 674de2b0c9248..c856125afe886 100644
--- a/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc
+++ b/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc
@@ -627,32 +627,29 @@ Edit `src/main/resources/application.properties` and inject the following config
[source,properties]
----
-quarkus.ssl.native=false <1>
+quarkus.datasource.db-kind=postgresql <1>
-quarkus.datasource.db-kind=postgresql <2>
+quarkus.hibernate-orm.sql-load-script=import.sql <2>
-quarkus.hibernate-orm.sql-load-script=import.sql <3>
+quarkus.hibernate-search-orm.elasticsearch.version=8 <3>
+quarkus.hibernate-search-orm.indexing.plan.synchronization.strategy=sync <4>
-quarkus.hibernate-search-orm.elasticsearch.version=8 <4>
-quarkus.hibernate-search-orm.indexing.plan.synchronization.strategy=sync <5>
-
-%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost/quarkus_test <6>
+%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost/quarkus_test
%prod.quarkus.datasource.username=quarkus_test
%prod.quarkus.datasource.password=quarkus_test
%prod.quarkus.hibernate-orm.database.generation=create
-%prod.quarkus.hibernate-search-orm.elasticsearch.hosts=localhost:9200 <6>
+%prod.quarkus.hibernate-search-orm.elasticsearch.hosts=localhost:9200 <5>
----
-<1> We won't use SSL, so we disable it to have a more compact native executable.
-<2> Let's create a PostgreSQL datasource.
-<3> We load some initial data on startup (see <>).
-<4> We need to tell Hibernate Search about the version of Elasticsearch we will use.
+<1> Let's create a PostgreSQL datasource.
+<2> We load some initial data on startup (see <>).
+<3> We need to tell Hibernate Search about the version of Elasticsearch we will use.
It is important because there are significant differences between Elasticsearch mapping syntax depending on the version.
Since the mapping is created at build time to reduce startup time, Hibernate Search cannot connect to the cluster to automatically detect the version.
Note that, for OpenSearch, you need to prefix the version with `opensearch:`; see <>.
-<5> This means that we wait for the entities to be searchable before considering a write complete.
+<4> This means that we wait for the entities to be searchable before considering a write complete.
On a production setup, the `write-sync` default will provide better performance.
Using `sync` is especially important when testing as you need the entities to be searchable immediately.
-<6> For development and tests, we rely on <>,
+<5> For development and tests, we rely on <>,
which means Quarkus will start a PostgreSQL database and Elasticsearch cluster automatically.
In production mode, however,
we will want to start a PostgreSQL database and Elasticsearch cluster manually,
diff --git a/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc b/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc
index bf2b4ef7dd14c..fc4f742d8c1c1 100644
--- a/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc
+++ b/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc
@@ -559,31 +559,28 @@ Edit `src/main/resources/application.properties` and inject the following config
[source,properties]
----
-quarkus.ssl.native=false <1>
+quarkus.hibernate-search-standalone.mapping.structure=document <1>
+quarkus.hibernate-search-standalone.elasticsearch.version=8 <2>
+quarkus.hibernate-search-standalone.indexing.plan.synchronization.strategy=sync <3>
-quarkus.hibernate-search-standalone.mapping.structure=document <2>
-quarkus.hibernate-search-standalone.elasticsearch.version=8 <3>
-quarkus.hibernate-search-standalone.indexing.plan.synchronization.strategy=sync <4>
-
-%prod.quarkus.hibernate-search-standalone.elasticsearch.hosts=localhost:9200 <5>
+%prod.quarkus.hibernate-search-standalone.elasticsearch.hosts=localhost:9200 <4>
----
-<1> We won't use SSL, so we disable it to have a more compact native executable.
-<2> We need to tell Hibernate Search about the structure of our entities.
+<1> We need to tell Hibernate Search about the structure of our entities.
+
In this application we consider an indexed entity (the author) is the root of a "document":
the author "owns" books it references through associations,
which *cannot* be updated independently of the author.
+
See <> for other options and more details.
-<3> We need to tell Hibernate Search about the version of Elasticsearch we will use.
+<2> We need to tell Hibernate Search about the version of Elasticsearch we will use.
+
It is important because there are significant differences between Elasticsearch mapping syntax depending on the version.
Since the mapping is created at build time to reduce startup time, Hibernate Search cannot connect to the cluster to automatically detect the version.
Note that, for OpenSearch, you need to prefix the version with `opensearch:`; see <>.
-<4> This means that we wait for the entities to be searchable before considering a write complete.
+<3> This means that we wait for the entities to be searchable before considering a write complete.
On a production setup, the `write-sync` default will provide better performance.
Using `sync` is especially important when testing as you need the entities to be searchable immediately.
-<5> For development and tests, we rely on <>,
+<4> For development and tests, we rely on <>,
which means Quarkus will start an Elasticsearch cluster automatically.
In production mode, however,
we will want to start an Elasticsearch cluster manually,
diff --git a/extensions/resteasy-classic/rest-client-config/runtime/src/main/java/io/quarkus/restclient/config/RestClientsConfig.java b/extensions/resteasy-classic/rest-client-config/runtime/src/main/java/io/quarkus/restclient/config/RestClientsConfig.java
index 2019f5ab507a4..d5bfb8d86a5ab 100644
--- a/extensions/resteasy-classic/rest-client-config/runtime/src/main/java/io/quarkus/restclient/config/RestClientsConfig.java
+++ b/extensions/resteasy-classic/rest-client-config/runtime/src/main/java/io/quarkus/restclient/config/RestClientsConfig.java
@@ -15,9 +15,11 @@
import io.quarkus.runtime.annotations.ConfigPhase;
import io.quarkus.runtime.annotations.ConfigRoot;
import io.quarkus.runtime.configuration.MemorySize;
+import io.quarkus.runtime.configuration.TrimmedStringConverter;
import io.smallrye.config.ConfigMapping;
import io.smallrye.config.ConfigValue;
import io.smallrye.config.SmallRyeConfig;
+import io.smallrye.config.WithConverter;
import io.smallrye.config.WithDefault;
import io.smallrye.config.WithDefaults;
import io.smallrye.config.WithKeys;
@@ -58,7 +60,7 @@ public interface RestClientsConfig {
*
* Can be overwritten by client-specific settings.
*/
- Optional proxyAddress();
+ Optional<@WithConverter(TrimmedStringConverter.class) String> proxyAddress();
/**
* Proxy username, equivalent to the http.proxy or https.proxy JVM settings.
@@ -449,7 +451,7 @@ default Optional uriReload() {
*
* Use `none` to disable proxy
*/
- Optional proxyAddress();
+ Optional<@WithConverter(TrimmedStringConverter.class) String> proxyAddress();
/**
* Proxy username.
diff --git a/extensions/resteasy-reactive/rest-client/deployment/src/test/resources/configuration-test-application.properties b/extensions/resteasy-reactive/rest-client/deployment/src/test/resources/configuration-test-application.properties
index 3a63d5e414381..e17a2f04f74e2 100644
--- a/extensions/resteasy-reactive/rest-client/deployment/src/test/resources/configuration-test-application.properties
+++ b/extensions/resteasy-reactive/rest-client/deployment/src/test/resources/configuration-test-application.properties
@@ -27,7 +27,8 @@ quarkus.rest-client.client-prefix.providers=io.quarkus.rest.client.reactive.Hell
quarkus.rest-client.client-prefix.connect-timeout=5000
quarkus.rest-client.client-prefix.read-timeout=6000
quarkus.rest-client.client-prefix.follow-redirects=true
-quarkus.rest-client.client-prefix.proxy-address=localhost:8080
+# intentionally add whitespace at the end to ensure we strip it
+quarkus.rest-client.client-prefix.proxy-address=localhost:8080
quarkus.rest-client.client-prefix.query-param-style=COMMA_SEPARATED
quarkus.rest-client.client-prefix.connection-ttl=30000
quarkus.rest-client.client-prefix.connection-pool-size=10
diff --git a/independent-projects/extension-maven-plugin/pom.xml b/independent-projects/extension-maven-plugin/pom.xml
index 07c4e4ec89003..3ebaed853b1a2 100644
--- a/independent-projects/extension-maven-plugin/pom.xml
+++ b/independent-projects/extension-maven-plugin/pom.xml
@@ -38,7 +38,7 @@
11113.9.9
- 2.18.1
+ 2.18.21.5.25.10.5
diff --git a/independent-projects/qute/core/src/main/java/io/quarkus/qute/MethodsCandidate.java b/independent-projects/qute/core/src/main/java/io/quarkus/qute/MethodsCandidate.java
index 6a6ea99d24e2e..10004a56e421e 100644
--- a/independent-projects/qute/core/src/main/java/io/quarkus/qute/MethodsCandidate.java
+++ b/independent-projects/qute/core/src/main/java/io/quarkus/qute/MethodsCandidate.java
@@ -62,7 +62,7 @@ public CompletionStage