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

porcelli pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-optaplanner.git


The following commit(s) were added to refs/heads/main by this push:
     new 8833fa4f22 Switch to using @ConfigMapping interfaces (#3177)
8833fa4f22 is described below

commit 8833fa4f22a45f38caaff1eca478e4e855cbd024
Author: Guillaume Smet <[email protected]>
AuthorDate: Tue Aug 19 20:09:29 2025 +0200

    Switch to using @ConfigMapping interfaces (#3177)
    
    Legacy @ConfigRoot classes support will be dropped soon from Quarkus and
    Quarkus 3.15+ already supports @ConfigMapping interfaces so we can move
    this project to the new infrastructure.
    
    One thing that is important is that you are currently using runtime
    config at static init - which means that it's build time for native
    images and this is not correct - and disallowed.
    
    I fixed it but the important consequence of this is that the solver will
    be initialized at runtime, including when building native image.
    
    This commit is still incomplete though as I end up with some class loader
    issues and I didn't have the time to go further.
---
 .../deployment/pom.xml                             |  3 --
 .../OptaPlannerBenchmarkBuildTimeConfig.java       | 11 ++++---
 .../deployment/OptaPlannerBenchmarkProcessor.java  |  9 ++---
 ...ProcessorMissingSpentLimitPerBenchmarkTest.java | 10 +++++-
 ...nerBenchmarkProcessorMissingSpentLimitTest.java | 10 +++++-
 .../optaplanner-quarkus-benchmark/runtime/pom.xml  |  3 --
 .../quarkus/OptaPlannerBenchmarkRecorder.java      | 38 +++++++++++++---------
 .../config/OptaPlannerBenchmarkRuntimeConfig.java  | 17 ++++++----
 .../optaplanner-quarkus-jackson/deployment/pom.xml |  3 --
 .../optaplanner-quarkus-jackson/runtime/pom.xml    |  3 --
 .../optaplanner-quarkus-jsonb/deployment/pom.xml   |  3 --
 .../optaplanner-quarkus-jsonb/runtime/pom.xml      |  3 --
 .../optaplanner-quarkus/deployment/pom.xml         |  3 --
 .../quarkus/deployment/OptaPlannerProcessor.java   | 28 +++++++++-------
 .../config/OptaPlannerBuildTimeConfig.java         | 16 ++++-----
 .../deployment/config/SolverBuildTimeConfig.java   | 15 +++------
 .../optaplanner-quarkus/runtime/pom.xml            |  3 --
 .../optaplanner/quarkus/OptaPlannerRecorder.java   | 29 +++++++++--------
 .../quarkus/config/OptaPlannerRuntimeConfig.java   | 13 ++++----
 .../quarkus/config/SolverManagerRuntimeConfig.java |  6 ++--
 .../quarkus/config/SolverRuntimeConfig.java        |  9 ++---
 .../quarkus/config/TerminationRuntimeConfig.java   | 14 ++++----
 22 files changed, 122 insertions(+), 127 deletions(-)

diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/pom.xml
 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/pom.xml
index b4d9efe999..9ec3c94eda 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/pom.xml
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/pom.xml
@@ -108,9 +108,6 @@
               <version>${version.io.quarkus}</version>
             </path>
           </annotationProcessorPaths>
-          <compilerArgs>
-            <arg>-AlegacyConfigRoot=true</arg>
-          </compilerArgs>
         </configuration>
       </plugin>
       <plugin>
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkBuildTimeConfig.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkBuildTimeConfig.java
index 1e354415aa..1f1b0fdc2e 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkBuildTimeConfig.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkBuildTimeConfig.java
@@ -21,21 +21,22 @@ package org.optaplanner.benchmark.quarkus.deployment;
 
 import java.util.Optional;
 
-import io.quarkus.runtime.annotations.ConfigItem;
 import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
 
 /**
  * During build time, this is translated into OptaPlanner's Config classes.
  */
-@ConfigRoot(name = "optaplanner.benchmark")
-public class OptaPlannerBenchmarkBuildTimeConfig {
+@ConfigRoot
+@ConfigMapping(prefix = "quarkus.optaplanner.benchmark")
+public interface OptaPlannerBenchmarkBuildTimeConfig {
 
     public static final String DEFAULT_SOLVER_BENCHMARK_CONFIG_URL = 
"solverBenchmarkConfig.xml";
+
     /**
      * A classpath resource to read the benchmark configuration XML.
      * Defaults to {@value DEFAULT_SOLVER_BENCHMARK_CONFIG_URL}.
      * If this property isn't specified, that solverBenchmarkConfig.xml is 
optional.
      */
-    @ConfigItem
-    Optional<String> solverBenchmarkConfigXml;
+    Optional<String> solverBenchmarkConfigXml();
 }
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkProcessor.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkProcessor.java
index 784c33a9b0..30b8f6a258 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkProcessor.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkProcessor.java
@@ -52,13 +52,13 @@ class OptaPlannerBenchmarkProcessor {
 
     @BuildStep
     HotDeploymentWatchedFileBuildItem watchSolverBenchmarkConfigXml() {
-        String solverBenchmarkConfigXML = 
optaPlannerBenchmarkBuildTimeConfig.solverBenchmarkConfigXml
+        String solverBenchmarkConfigXML = 
optaPlannerBenchmarkBuildTimeConfig.solverBenchmarkConfigXml()
                 
.orElse(OptaPlannerBenchmarkBuildTimeConfig.DEFAULT_SOLVER_BENCHMARK_CONFIG_URL);
         return new HotDeploymentWatchedFileBuildItem(solverBenchmarkConfigXML);
     }
 
     @BuildStep
-    @Record(ExecutionTime.STATIC_INIT)
+    @Record(ExecutionTime.RUNTIME_INIT)
     void registerAdditionalBeans(BuildProducer<AdditionalBeanBuildItem> 
additionalBeans,
             BuildProducer<SyntheticBeanBuildItem> syntheticBeans,
             BuildProducer<UnremovableBeanBuildItem> unremovableBeans,
@@ -71,8 +71,8 @@ class OptaPlannerBenchmarkProcessor {
         }
         PlannerBenchmarkConfig benchmarkConfig;
         ClassLoader classLoader = 
Thread.currentThread().getContextClassLoader();
-        if 
(optaPlannerBenchmarkBuildTimeConfig.solverBenchmarkConfigXml.isPresent()) {
-            String solverBenchmarkConfigXML = 
optaPlannerBenchmarkBuildTimeConfig.solverBenchmarkConfigXml.get();
+        if 
(optaPlannerBenchmarkBuildTimeConfig.solverBenchmarkConfigXml().isPresent()) {
+            String solverBenchmarkConfigXML = 
optaPlannerBenchmarkBuildTimeConfig.solverBenchmarkConfigXml().get();
             if (classLoader.getResource(solverBenchmarkConfigXML) == null) {
                 throw new ConfigurationException("Invalid 
quarkus.optaplanner.benchmark.solver-benchmark-config-xml property ("
                         + solverBenchmarkConfigXML + "): that classpath 
resource does not exist.");
@@ -85,6 +85,7 @@ class OptaPlannerBenchmarkProcessor {
             benchmarkConfig = null;
         }
         
syntheticBeans.produce(SyntheticBeanBuildItem.configure(PlannerBenchmarkConfig.class)
+                .setRuntimeInit()
                 .supplier(recorder.benchmarkConfigSupplier(benchmarkConfig))
                 .done());
         additionalBeans.produce(new 
AdditionalBeanBuildItem(OptaPlannerBenchmarkBeanProvider.class));
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitPerBenchmarkTest.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitPerBenchmarkTest.java
index a099699774..e45dfadd5d 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitPerBenchmarkTest.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitPerBenchmarkTest.java
@@ -21,6 +21,8 @@ package org.optaplanner.benchmark.quarkus;
 
 import java.util.concurrent.ExecutionException;
 
+import jakarta.inject.Inject;
+
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Assertions;
@@ -28,10 +30,12 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.optaplanner.benchmark.config.PlannerBenchmarkConfig;
 import org.optaplanner.benchmark.config.SolverBenchmarkConfig;
+import 
org.optaplanner.benchmark.quarkus.config.OptaPlannerBenchmarkRuntimeConfig;
 import 
org.optaplanner.benchmark.quarkus.testdata.normal.constraints.TestdataQuarkusConstraintProvider;
 import 
org.optaplanner.benchmark.quarkus.testdata.normal.domain.TestdataQuarkusEntity;
 import 
org.optaplanner.benchmark.quarkus.testdata.normal.domain.TestdataQuarkusSolution;
 
+import io.quarkus.runtime.RuntimeValue;
 import io.quarkus.test.QuarkusUnitTest;
 
 class OptaPlannerBenchmarkProcessorMissingSpentLimitPerBenchmarkTest {
@@ -46,12 +50,16 @@ class 
OptaPlannerBenchmarkProcessorMissingSpentLimitPerBenchmarkTest {
                             TestdataQuarkusSolution.class, 
TestdataQuarkusConstraintProvider.class)
                     
.addAsResource("solverBenchmarkConfigSpentLimitPerBenchmarkNoTermination.xml"));
 
+    @Inject
+    OptaPlannerBenchmarkRuntimeConfig optaPlannerBenchmarkRuntimeConfig;
+
     @Test
     void benchmark() throws ExecutionException, InterruptedException {
         PlannerBenchmarkConfig benchmarkConfig =
                 
PlannerBenchmarkConfig.createFromXmlResource("solverBenchmarkConfigSpentLimitPerBenchmarkNoTermination.xml");
         IllegalStateException exception = 
Assertions.assertThrows(IllegalStateException.class, () -> {
-            new 
OptaPlannerBenchmarkRecorder().benchmarkConfigSupplier(benchmarkConfig).get();
+            new OptaPlannerBenchmarkRecorder(new 
RuntimeValue<>(optaPlannerBenchmarkRuntimeConfig))
+                    .benchmarkConfigSupplier(benchmarkConfig).get();
         });
         Assertions.assertEquals(
                 "The following " + SolverBenchmarkConfig.class.getSimpleName() 
+ " do not " +
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitTest.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitTest.java
index d53643dcf6..5d4f8045eb 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitTest.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitTest.java
@@ -21,16 +21,20 @@ package org.optaplanner.benchmark.quarkus;
 
 import java.util.concurrent.ExecutionException;
 
+import jakarta.inject.Inject;
+
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.optaplanner.benchmark.config.PlannerBenchmarkConfig;
+import 
org.optaplanner.benchmark.quarkus.config.OptaPlannerBenchmarkRuntimeConfig;
 import 
org.optaplanner.benchmark.quarkus.testdata.normal.constraints.TestdataQuarkusConstraintProvider;
 import 
org.optaplanner.benchmark.quarkus.testdata.normal.domain.TestdataQuarkusEntity;
 import 
org.optaplanner.benchmark.quarkus.testdata.normal.domain.TestdataQuarkusSolution;
 
+import io.quarkus.runtime.RuntimeValue;
 import io.quarkus.test.QuarkusUnitTest;
 
 class OptaPlannerBenchmarkProcessorMissingSpentLimitTest {
@@ -42,10 +46,14 @@ class OptaPlannerBenchmarkProcessorMissingSpentLimitTest {
                     .addClasses(TestdataQuarkusEntity.class,
                             TestdataQuarkusSolution.class, 
TestdataQuarkusConstraintProvider.class));
 
+    @Inject
+    OptaPlannerBenchmarkRuntimeConfig optaPlannerBenchmarkRuntimeConfig;
+
     @Test
     void benchmark() throws ExecutionException, InterruptedException {
         IllegalStateException exception = 
Assertions.assertThrows(IllegalStateException.class, () -> {
-            new OptaPlannerBenchmarkRecorder().benchmarkConfigSupplier(new 
PlannerBenchmarkConfig()).get();
+            new OptaPlannerBenchmarkRecorder(new 
RuntimeValue<>(optaPlannerBenchmarkRuntimeConfig))
+                    .benchmarkConfigSupplier(new 
PlannerBenchmarkConfig()).get();
         });
         Assertions.assertEquals(
                 "At least one of the properties 
quarkus.optaplanner.benchmark.solver.termination.spent-limit, 
quarkus.optaplanner.benchmark.solver.termination.best-score-limit, 
quarkus.optaplanner.benchmark.solver.termination.unimproved-spent-limit is 
required if termination is not configured in the inherited solver benchmark 
config and solverBenchmarkBluePrint is used.",
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/pom.xml 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/pom.xml
index 6ea95c3f30..2dcbb2d5a5 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/pom.xml
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/pom.xml
@@ -96,9 +96,6 @@
               <version>${version.io.quarkus}</version>
             </path>
           </annotationProcessorPaths>
-          <compilerArgs>
-            <arg>-AlegacyConfigRoot=true</arg>
-          </compilerArgs>
         </configuration>
       </plugin>
       <plugin>
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkRecorder.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkRecorder.java
index a20c73454b..44b4b2ad91 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkRecorder.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkRecorder.java
@@ -38,21 +38,29 @@ import org.optaplanner.core.config.solver.SolverConfig;
 import org.optaplanner.core.config.solver.termination.TerminationConfig;
 
 import io.quarkus.arc.Arc;
+import io.quarkus.runtime.RuntimeValue;
 import io.quarkus.runtime.annotations.Recorder;
 
 @Recorder
 public class OptaPlannerBenchmarkRecorder {
+
+    private final RuntimeValue<OptaPlannerBenchmarkRuntimeConfig> 
optaplannerBenchmarkRuntimeConfig;
+
+    public 
OptaPlannerBenchmarkRecorder(RuntimeValue<OptaPlannerBenchmarkRuntimeConfig> 
optaplannerBenchmarkRuntimeConfig) {
+        this.optaplannerBenchmarkRuntimeConfig = 
optaplannerBenchmarkRuntimeConfig;
+    }
+
     public Supplier<PlannerBenchmarkConfig> 
benchmarkConfigSupplier(PlannerBenchmarkConfig benchmarkConfig) {
         return () -> {
-            OptaPlannerBenchmarkRuntimeConfig optaPlannerRuntimeConfig =
-                    
Arc.container().instance(OptaPlannerBenchmarkRuntimeConfig.class).get();
             SolverConfig solverConfig =
                     Arc.container().instance(SolverConfig.class).get();
-            return updateBenchmarkConfigWithRuntimeProperties(benchmarkConfig, 
optaPlannerRuntimeConfig, solverConfig);
+            return updateBenchmarkConfigWithRuntimeProperties(benchmarkConfig, 
optaplannerBenchmarkRuntimeConfig.getValue(),
+                    solverConfig);
         };
     }
 
-    private PlannerBenchmarkConfig 
updateBenchmarkConfigWithRuntimeProperties(PlannerBenchmarkConfig 
plannerBenchmarkConfig,
+    private static PlannerBenchmarkConfig 
updateBenchmarkConfigWithRuntimeProperties(
+            PlannerBenchmarkConfig plannerBenchmarkConfig,
             OptaPlannerBenchmarkRuntimeConfig benchmarkRuntimeConfig,
             SolverConfig solverConfig) {
         if (plannerBenchmarkConfig == null) { // no benchmarkConfig.xml 
provided
@@ -60,7 +68,7 @@ public class OptaPlannerBenchmarkRecorder {
             plannerBenchmarkConfig = 
PlannerBenchmarkConfig.createFromSolverConfig(solverConfig);
         }
 
-        plannerBenchmarkConfig.setBenchmarkDirectory(new 
File(benchmarkRuntimeConfig.resultDirectory));
+        plannerBenchmarkConfig.setBenchmarkDirectory(new 
File(benchmarkRuntimeConfig.resultDirectory()));
         SolverBenchmarkConfig inheritedBenchmarkConfig = 
plannerBenchmarkConfig.getInheritedSolverBenchmarkConfig();
 
         if (plannerBenchmarkConfig.getSolverBenchmarkBluePrintConfigList() != 
null) {
@@ -76,10 +84,10 @@ public class OptaPlannerBenchmarkRecorder {
                 inheritedTerminationConfig = new TerminationConfig();
                 
inheritedBenchmarkConfig.getSolverConfig().setTerminationConfig(inheritedTerminationConfig);
             }
-            
benchmarkRuntimeConfig.termination.spentLimit.ifPresent(inheritedTerminationConfig::setSpentLimit);
-            benchmarkRuntimeConfig.termination.unimprovedSpentLimit
+            
benchmarkRuntimeConfig.termination().spentLimit().ifPresent(inheritedTerminationConfig::setSpentLimit);
+            benchmarkRuntimeConfig.termination().unimprovedSpentLimit()
                     
.ifPresent(inheritedTerminationConfig::setUnimprovedSpentLimit);
-            
benchmarkRuntimeConfig.termination.bestScoreLimit.ifPresent(inheritedTerminationConfig::setBestScoreLimit);
+            
benchmarkRuntimeConfig.termination().bestScoreLimit().ifPresent(inheritedTerminationConfig::setBestScoreLimit);
         }
 
         TerminationConfig inheritedTerminationConfig = null;
@@ -112,10 +120,10 @@ public class OptaPlannerBenchmarkRecorder {
                     continue;
                 }
 
-                
benchmarkRuntimeConfig.termination.spentLimit.ifPresent(terminationConfig::setSpentLimit);
-                benchmarkRuntimeConfig.termination.unimprovedSpentLimit
+                
benchmarkRuntimeConfig.termination().spentLimit().ifPresent(terminationConfig::setSpentLimit);
+                benchmarkRuntimeConfig.termination().unimprovedSpentLimit()
                         .ifPresent(terminationConfig::setUnimprovedSpentLimit);
-                
benchmarkRuntimeConfig.termination.bestScoreLimit.ifPresent(terminationConfig::setBestScoreLimit);
+                
benchmarkRuntimeConfig.termination().bestScoreLimit().ifPresent(terminationConfig::setBestScoreLimit);
 
                 if (!terminationConfig.isConfigured()) {
                     List<PhaseConfig> phaseConfigList = 
solverBenchmarkConfig.getSolverConfig().getPhaseConfigList();
@@ -173,7 +181,7 @@ public class OptaPlannerBenchmarkRecorder {
         return plannerBenchmarkConfig;
     }
 
-    private void inheritPropertiesFromSolverConfig(SolverBenchmarkConfig 
childBenchmarkConfig,
+    private static void 
inheritPropertiesFromSolverConfig(SolverBenchmarkConfig childBenchmarkConfig,
             SolverBenchmarkConfig inheritedBenchmarkConfig,
             SolverConfig solverConfig) {
         inheritProperty(childBenchmarkConfig, inheritedBenchmarkConfig, 
solverConfig,
@@ -183,7 +191,7 @@ public class OptaPlannerBenchmarkRecorder {
         inheritScoreCalculation(childBenchmarkConfig, 
inheritedBenchmarkConfig, solverConfig);
     }
 
-    private <T> void inheritProperty(SolverBenchmarkConfig 
childBenchmarkConfig,
+    private static <T> void inheritProperty(SolverBenchmarkConfig 
childBenchmarkConfig,
             SolverBenchmarkConfig inheritedBenchmarkConfig,
             SolverConfig solverConfig,
             Function<SolverConfig, T> getter,
@@ -198,7 +206,7 @@ public class OptaPlannerBenchmarkRecorder {
         setter.accept(childBenchmarkConfig.getSolverConfig(), 
getter.apply(solverConfig));
     }
 
-    private void inheritScoreCalculation(SolverBenchmarkConfig 
childBenchmarkConfig,
+    private static void inheritScoreCalculation(SolverBenchmarkConfig 
childBenchmarkConfig,
             SolverBenchmarkConfig inheritedBenchmarkConfig,
             SolverConfig solverConfig) {
 
@@ -219,7 +227,7 @@ public class OptaPlannerBenchmarkRecorder {
         
childScoreDirectorFactoryConfig.inherit(inheritedScoreDirectorFactoryConfig);
     }
 
-    private boolean isScoreCalculationDefined(SolverConfig solverConfig) {
+    private static boolean isScoreCalculationDefined(SolverConfig 
solverConfig) {
         if (solverConfig == null) {
             return false;
         }
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/config/OptaPlannerBenchmarkRuntimeConfig.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/config/OptaPlannerBenchmarkRuntimeConfig.java
index 32e3939b6f..8320f8e162 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/config/OptaPlannerBenchmarkRuntimeConfig.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/config/OptaPlannerBenchmarkRuntimeConfig.java
@@ -21,24 +21,27 @@ package org.optaplanner.benchmark.quarkus.config;
 
 import org.optaplanner.quarkus.config.TerminationRuntimeConfig;
 
-import io.quarkus.runtime.annotations.ConfigItem;
 import io.quarkus.runtime.annotations.ConfigPhase;
 import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
+import io.smallrye.config.WithDefault;
+import io.smallrye.config.WithName;
 
-@ConfigRoot(name = "optaplanner.benchmark", phase = ConfigPhase.RUN_TIME)
-public class OptaPlannerBenchmarkRuntimeConfig {
+@ConfigRoot(phase = ConfigPhase.RUN_TIME)
+@ConfigMapping(prefix = "quarkus.optaplanner.benchmark")
+public interface OptaPlannerBenchmarkRuntimeConfig {
     public static final String DEFAULT_BENCHMARK_RESULT_DIRECTORY = 
"target/benchmarks";
 
     /**
      * Where the benchmark results are written to. Defaults to
      * {@link DEFAULT_BENCHMARK_RESULT_DIRECTORY}.
      */
-    @ConfigItem(defaultValue = DEFAULT_BENCHMARK_RESULT_DIRECTORY)
-    public String resultDirectory;
+    @WithDefault(DEFAULT_BENCHMARK_RESULT_DIRECTORY)
+    String resultDirectory();
 
     /**
      * Termination configuration for the solvers run in the benchmark.
      */
-    @ConfigItem(name = "solver.termination")
-    public TerminationRuntimeConfig termination;
+    @WithName("solver.termination")
+    TerminationRuntimeConfig termination();
 }
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/deployment/pom.xml
 
b/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/deployment/pom.xml
index 3da3593b77..950f767c91 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/deployment/pom.xml
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/deployment/pom.xml
@@ -73,9 +73,6 @@
               <version>${version.io.quarkus}</version>
             </path>
           </annotationProcessorPaths>
-          <compilerArgs>
-            <arg>-AlegacyConfigRoot=true</arg>
-          </compilerArgs>
         </configuration>
       </plugin>
     </plugins>
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/runtime/pom.xml 
b/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/runtime/pom.xml
index fcbb3ec9ab..f42a2da5be 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/runtime/pom.xml
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/runtime/pom.xml
@@ -91,9 +91,6 @@
               <version>${version.io.quarkus}</version>
             </path>
           </annotationProcessorPaths>
-          <compilerArgs>
-            <arg>-AlegacyConfigRoot=true</arg>
-          </compilerArgs>
         </configuration>
       </plugin>
       <plugin>
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/deployment/pom.xml 
b/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/deployment/pom.xml
index eae3edb933..353abd04b7 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/deployment/pom.xml
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/deployment/pom.xml
@@ -73,9 +73,6 @@
               <version>${version.io.quarkus}</version>
             </path>
           </annotationProcessorPaths>
-          <compilerArgs>
-            <arg>-AlegacyConfigRoot=true</arg>
-          </compilerArgs>
         </configuration>
       </plugin>
     </plugins>
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/runtime/pom.xml 
b/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/runtime/pom.xml
index eaabc990cc..e1d07f0335 100644
--- a/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/runtime/pom.xml
+++ b/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/runtime/pom.xml
@@ -92,9 +92,6 @@
               <version>${version.io.quarkus}</version>
             </path>
           </annotationProcessorPaths>
-          <compilerArgs>
-            <arg>-AlegacyConfigRoot=true</arg>
-          </compilerArgs>
         </configuration>
       </plugin>
     </plugins>
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/pom.xml 
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/pom.xml
index 7be68161a0..139cd6f880 100644
--- a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/pom.xml
+++ b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/pom.xml
@@ -106,9 +106,6 @@
               <version>${version.io.quarkus}</version>
             </path>
           </annotationProcessorPaths>
-          <compilerArgs>
-            <arg>-AlegacyConfigRoot=true</arg>
-          </compilerArgs>
         </configuration>
       </plugin>
       <plugin>
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/OptaPlannerProcessor.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/OptaPlannerProcessor.java
index c31adfd5e1..eb597ebcbe 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/OptaPlannerProcessor.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/OptaPlannerProcessor.java
@@ -19,6 +19,7 @@
 
 package org.optaplanner.quarkus.deployment;
 
+import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT;
 import static io.quarkus.deployment.annotations.ExecutionTime.STATIC_INIT;
 
 import java.io.IOException;
@@ -137,7 +138,7 @@ class OptaPlannerProcessor {
 
     @BuildStep
     HotDeploymentWatchedFileBuildItem watchSolverConfigXml() {
-        String solverConfigXML = optaPlannerBuildTimeConfig.solverConfigXml
+        String solverConfigXML = optaPlannerBuildTimeConfig.solverConfigXml()
                 .orElse(OptaPlannerBuildTimeConfig.DEFAULT_SOLVER_CONFIG_URL);
         return new HotDeploymentWatchedFileBuildItem(solverConfigXML);
     }
@@ -145,7 +146,7 @@ class OptaPlannerProcessor {
     @BuildStep
     HotDeploymentWatchedFileBuildItem watchConstraintsDrl() {
         String constraintsDrl =
-                
optaPlannerBuildTimeConfig.scoreDrl.orElse(OptaPlannerBuildTimeConfig.DEFAULT_CONSTRAINTS_DRL_URL);
+                
optaPlannerBuildTimeConfig.scoreDrl().orElse(OptaPlannerBuildTimeConfig.DEFAULT_CONSTRAINTS_DRL_URL);
         return new HotDeploymentWatchedFileBuildItem(constraintsDrl);
     }
 
@@ -225,9 +226,10 @@ class OptaPlannerProcessor {
     }
 
     @BuildStep
-    @Record(STATIC_INIT)
+    @Record(RUNTIME_INIT)
     SolverConfigBuildItem recordAndRegisterBeans(OptaPlannerRecorder recorder, 
RecorderContext recorderContext,
             DetermineIfNativeBuildItem determineIfNative, 
CombinedIndexBuildItem combinedIndex,
+            OptaPlannerRuntimeConfig optaplannerRuntimeConfig,
             BuildProducer<ReflectiveHierarchyBuildItem> 
reflectiveHierarchyClass,
             BuildProducer<SyntheticBeanBuildItem> 
syntheticBeanBuildItemBuildProducer,
             BuildProducer<AdditionalBeanBuildItem> additionalBeans,
@@ -254,8 +256,8 @@ class OptaPlannerProcessor {
         // Internally, OptaPlanner defaults the ClassLoader to 
getContextClassLoader() too
         ClassLoader classLoader = 
Thread.currentThread().getContextClassLoader();
         SolverConfig solverConfig;
-        if (optaPlannerBuildTimeConfig.solverConfigXml.isPresent()) {
-            String solverConfigXML = 
optaPlannerBuildTimeConfig.solverConfigXml.get();
+        if (optaPlannerBuildTimeConfig.solverConfigXml().isPresent()) {
+            String solverConfigXML = 
optaPlannerBuildTimeConfig.solverConfigXml().get();
             if (classLoader.getResource(solverConfigXML) == null) {
                 throw new ConfigurationException("Invalid 
quarkus.optaplanner.solverConfigXML property ("
                         + solverConfigXML + "): that classpath resource does 
not exist.");
@@ -313,6 +315,7 @@ class OptaPlannerProcessor {
         
syntheticBeanBuildItemBuildProducer.produce(SyntheticBeanBuildItem.configure(SolverConfig.class)
                 .scope(Singleton.class)
                 .defaultBean()
+                .setRuntimeInit()
                 .supplier(recorder.solverConfigSupplier(solverConfig,
                         
GizmoMemberAccessorEntityEnhancer.getGeneratedGizmoMemberAccessorMap(recorderContext,
                                 
generatedGizmoClasses.generatedGizmoMemberAccessorClassSet),
@@ -323,6 +326,7 @@ class OptaPlannerProcessor {
         
syntheticBeanBuildItemBuildProducer.produce(SyntheticBeanBuildItem.configure(SolverManagerConfig.class)
                 .scope(Singleton.class)
                 .defaultBean()
+                .setRuntimeInit()
                 
.supplier(recorder.solverManagerConfig(solverManagerConfig)).done());
 
         additionalBeans.produce(new 
AdditionalBeanBuildItem(DefaultOptaPlannerBeanProvider.class));
@@ -419,10 +423,10 @@ class OptaPlannerProcessor {
             solverConfig.setEntityClassList(findEntityClassList(indexView));
         }
         applyScoreDirectorFactoryProperties(indexView, solverConfig);
-        
optaPlannerBuildTimeConfig.solver.environmentMode.ifPresent(solverConfig::setEnvironmentMode);
-        
optaPlannerBuildTimeConfig.solver.daemon.ifPresent(solverConfig::setDaemon);
-        
optaPlannerBuildTimeConfig.solver.domainAccessType.ifPresent(solverConfig::setDomainAccessType);
-        
optaPlannerBuildTimeConfig.solver.constraintStreamImplType.ifPresent(solverConfig::withConstraintStreamImplType);
+        
optaPlannerBuildTimeConfig.solver().environmentMode().ifPresent(solverConfig::setEnvironmentMode);
+        
optaPlannerBuildTimeConfig.solver().daemon().ifPresent(solverConfig::setDaemon);
+        
optaPlannerBuildTimeConfig.solver().domainAccessType().ifPresent(solverConfig::setDomainAccessType);
+        
optaPlannerBuildTimeConfig.solver().constraintStreamImplType().ifPresent(solverConfig::withConstraintStreamImplType);
 
         if (solverConfig.getDomainAccessType() == null) {
             solverConfig.setDomainAccessType(DomainAccessType.GIZMO);
@@ -579,15 +583,15 @@ class OptaPlannerProcessor {
     }
 
     protected Optional<String> constraintsDrl() {
-        if (optaPlannerBuildTimeConfig.scoreDrl.isPresent()) {
-            String constraintsDrl = optaPlannerBuildTimeConfig.scoreDrl.get();
+        if (optaPlannerBuildTimeConfig.scoreDrl().isPresent()) {
+            String constraintsDrl = 
optaPlannerBuildTimeConfig.scoreDrl().get();
             ClassLoader classLoader = 
Thread.currentThread().getContextClassLoader();
             if (classLoader.getResource(constraintsDrl) == null) {
                 throw new IllegalStateException("Invalid " + 
OptaPlannerBuildTimeConfig.CONSTRAINTS_DRL_PROPERTY
                         + " property (" + constraintsDrl + "): that classpath 
resource does not exist.");
             }
         }
-        return optaPlannerBuildTimeConfig.scoreDrl;
+        return optaPlannerBuildTimeConfig.scoreDrl();
     }
 
     protected Optional<String> defaultConstraintsDrl() {
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/OptaPlannerBuildTimeConfig.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/OptaPlannerBuildTimeConfig.java
index e54d41ebe8..bcc0c0d562 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/OptaPlannerBuildTimeConfig.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/OptaPlannerBuildTimeConfig.java
@@ -26,14 +26,15 @@ import 
org.optaplanner.core.api.score.calculator.IncrementalScoreCalculator;
 import org.optaplanner.core.api.score.stream.ConstraintProvider;
 import org.optaplanner.core.config.solver.SolverConfig;
 
-import io.quarkus.runtime.annotations.ConfigItem;
 import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
 
 /**
  * During build time, this is translated into OptaPlanner's Config classes.
  */
-@ConfigRoot(name = "optaplanner")
-public class OptaPlannerBuildTimeConfig {
+@ConfigRoot
+@ConfigMapping(prefix = "quarkus.optaplanner")
+public interface OptaPlannerBuildTimeConfig {
 
     public static final String DEFAULT_SOLVER_CONFIG_URL = "solverConfig.xml";
     public static final String DEFAULT_CONSTRAINTS_DRL_URL = "constraints.drl";
@@ -44,8 +45,7 @@ public class OptaPlannerBuildTimeConfig {
      * Defaults to {@value DEFAULT_SOLVER_CONFIG_URL}.
      * If this property isn't specified, that solverConfig.xml is optional.
      */
-    @ConfigItem
-    public Optional<String> solverConfigXml;
+    Optional<String> solverConfigXml();
 
     /**
      * A classpath resource to read the solver score DRL.
@@ -53,13 +53,11 @@ public class OptaPlannerBuildTimeConfig {
      * Do not define this property when a {@link ConstraintProvider}, {@link 
EasyScoreCalculator} or
      * {@link IncrementalScoreCalculator} class exists.
      */
-    @ConfigItem
-    public Optional<String> scoreDrl;
+    Optional<String> scoreDrl();
 
     /**
      * Configuration properties that overwrite OptaPlanner's {@link 
SolverConfig}.
      */
-    @ConfigItem
-    public SolverBuildTimeConfig solver;
+    SolverBuildTimeConfig solver();
 
 }
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/SolverBuildTimeConfig.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/SolverBuildTimeConfig.java
index 7597dcfc8f..c2681020d8 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/SolverBuildTimeConfig.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/SolverBuildTimeConfig.java
@@ -28,7 +28,6 @@ import org.optaplanner.core.config.solver.SolverConfig;
 import org.optaplanner.quarkus.config.SolverRuntimeConfig;
 
 import io.quarkus.runtime.annotations.ConfigGroup;
-import io.quarkus.runtime.annotations.ConfigItem;
 
 /**
  * During build time, this is translated into OptaPlanner's {@link 
SolverConfig}
@@ -37,34 +36,30 @@ import io.quarkus.runtime.annotations.ConfigItem;
  * See also {@link SolverRuntimeConfig}
  */
 @ConfigGroup
-public class SolverBuildTimeConfig {
+public interface SolverBuildTimeConfig {
 
     /**
      * Enable runtime assertions to detect common bugs in your implementation 
during development.
      * Defaults to {@link EnvironmentMode#REPRODUCIBLE}.
      */
-    @ConfigItem
-    public Optional<EnvironmentMode> environmentMode;
+    Optional<EnvironmentMode> environmentMode();
 
     /**
      * Enable daemon mode. In daemon mode, non-early termination pauses the 
solver instead of stopping it,
      * until the next problem fact change arrives. This is often useful for 
real-time planning.
      * Defaults to "false".
      */
-    @ConfigItem
-    public Optional<Boolean> daemon;
+    Optional<Boolean> daemon();
 
     /**
      * Determines how to access the fields and methods of domain classes.
      * Defaults to {@link DomainAccessType#GIZMO}.
      */
-    @ConfigItem
-    public Optional<DomainAccessType> domainAccessType;
+    Optional<DomainAccessType> domainAccessType();
 
     /**
      * What constraint stream implementation to use. Defaults to {@link 
ConstraintStreamImplType#DROOLS}.
      */
-    @ConfigItem
-    public Optional<ConstraintStreamImplType> constraintStreamImplType;
+    Optional<ConstraintStreamImplType> constraintStreamImplType();
 
 }
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/pom.xml 
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/pom.xml
index 4f70512453..e3420bf10b 100644
--- a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/pom.xml
+++ b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/pom.xml
@@ -104,9 +104,6 @@
               <version>${version.io.quarkus}</version>
             </path>
           </annotationProcessorPaths>
-          <compilerArgs>
-            <arg>-AlegacyConfigRoot=true</arg>
-          </compilerArgs>
         </configuration>
       </plugin>
       <plugin>
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/OptaPlannerRecorder.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/OptaPlannerRecorder.java
index 07f1a9fd32..e879932408 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/OptaPlannerRecorder.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/OptaPlannerRecorder.java
@@ -30,20 +30,23 @@ import 
org.optaplanner.core.config.solver.termination.TerminationConfig;
 import org.optaplanner.core.impl.domain.common.accessor.MemberAccessor;
 import org.optaplanner.quarkus.config.OptaPlannerRuntimeConfig;
 
-import io.quarkus.arc.Arc;
 import io.quarkus.runtime.RuntimeValue;
 import io.quarkus.runtime.annotations.Recorder;
 
 @Recorder
 public class OptaPlannerRecorder {
 
+    private final RuntimeValue<OptaPlannerRuntimeConfig> 
optaPlannerRuntimeConfig;
+
+    public OptaPlannerRecorder(RuntimeValue<OptaPlannerRuntimeConfig> 
optaPlannerRuntimeConfig) {
+        this.optaPlannerRuntimeConfig = optaPlannerRuntimeConfig;
+    }
+
     public Supplier<SolverConfig> solverConfigSupplier(final SolverConfig 
solverConfig,
             Map<String, RuntimeValue<MemberAccessor>> 
generatedGizmoMemberAccessorMap,
             Map<String, RuntimeValue<SolutionCloner>> 
generatedGizmoSolutionClonerMap) {
         return () -> {
-            OptaPlannerRuntimeConfig optaPlannerRuntimeConfig =
-                    
Arc.container().instance(OptaPlannerRuntimeConfig.class).get();
-            updateSolverConfigWithRuntimeProperties(solverConfig, 
optaPlannerRuntimeConfig);
+            updateSolverConfigWithRuntimeProperties(solverConfig, 
optaPlannerRuntimeConfig.getValue());
             Map<String, MemberAccessor> memberAccessorMap = new HashMap<>();
             Map<String, SolutionCloner> solutionClonerMap = new HashMap<>();
             generatedGizmoMemberAccessorMap
@@ -59,30 +62,28 @@ public class OptaPlannerRecorder {
 
     public Supplier<SolverManagerConfig> solverManagerConfig(final 
SolverManagerConfig solverManagerConfig) {
         return () -> {
-            OptaPlannerRuntimeConfig optaPlannerRuntimeConfig =
-                    
Arc.container().instance(OptaPlannerRuntimeConfig.class).get();
-            
updateSolverManagerConfigWithRuntimeProperties(solverManagerConfig, 
optaPlannerRuntimeConfig);
+            
updateSolverManagerConfigWithRuntimeProperties(solverManagerConfig, 
optaPlannerRuntimeConfig.getValue());
             return solverManagerConfig;
         };
     }
 
-    private void updateSolverConfigWithRuntimeProperties(SolverConfig 
solverConfig,
+    private static void updateSolverConfigWithRuntimeProperties(SolverConfig 
solverConfig,
             OptaPlannerRuntimeConfig optaPlannerRunTimeConfig) {
         TerminationConfig terminationConfig = 
solverConfig.getTerminationConfig();
         if (terminationConfig == null) {
             terminationConfig = new TerminationConfig();
             solverConfig.setTerminationConfig(terminationConfig);
         }
-        
optaPlannerRunTimeConfig.solver.termination.spentLimit.ifPresent(terminationConfig::setSpentLimit);
-        optaPlannerRunTimeConfig.solver.termination.unimprovedSpentLimit
+        
optaPlannerRunTimeConfig.solver().termination().spentLimit().ifPresent(terminationConfig::setSpentLimit);
+        optaPlannerRunTimeConfig.solver().termination().unimprovedSpentLimit()
                 .ifPresent(terminationConfig::setUnimprovedSpentLimit);
-        
optaPlannerRunTimeConfig.solver.termination.bestScoreLimit.ifPresent(terminationConfig::setBestScoreLimit);
-        
optaPlannerRunTimeConfig.solver.moveThreadCount.ifPresent(solverConfig::setMoveThreadCount);
+        
optaPlannerRunTimeConfig.solver().termination().bestScoreLimit().ifPresent(terminationConfig::setBestScoreLimit);
+        
optaPlannerRunTimeConfig.solver().moveThreadCount().ifPresent(solverConfig::setMoveThreadCount);
     }
 
-    private void 
updateSolverManagerConfigWithRuntimeProperties(SolverManagerConfig 
solverManagerConfig,
+    private static void 
updateSolverManagerConfigWithRuntimeProperties(SolverManagerConfig 
solverManagerConfig,
             OptaPlannerRuntimeConfig optaPlannerRunTimeConfig) {
-        
optaPlannerRunTimeConfig.solverManager.parallelSolverCount.ifPresent(solverManagerConfig::setParallelSolverCount);
+        
optaPlannerRunTimeConfig.solverManager().parallelSolverCount().ifPresent(solverManagerConfig::setParallelSolverCount);
     }
 
 }
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/OptaPlannerRuntimeConfig.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/OptaPlannerRuntimeConfig.java
index 515e1e4b1c..fc3b8a8cb5 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/OptaPlannerRuntimeConfig.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/OptaPlannerRuntimeConfig.java
@@ -22,22 +22,21 @@ package org.optaplanner.quarkus.config;
 import org.optaplanner.core.config.solver.SolverConfig;
 import org.optaplanner.core.config.solver.SolverManagerConfig;
 
-import io.quarkus.runtime.annotations.ConfigItem;
 import io.quarkus.runtime.annotations.ConfigPhase;
 import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
 
-@ConfigRoot(name = "optaplanner", phase = ConfigPhase.RUN_TIME)
-public class OptaPlannerRuntimeConfig {
+@ConfigRoot(phase = ConfigPhase.RUN_TIME)
+@ConfigMapping(prefix = "quarkus.optaplanner")
+public interface OptaPlannerRuntimeConfig {
     /**
      * During run time, this is translated into OptaPlanner's {@link 
SolverConfig}
      * runtime properties.
      */
-    @ConfigItem
-    public SolverRuntimeConfig solver;
+    SolverRuntimeConfig solver();
 
     /**
      * Configuration properties that overwrite OptaPlanner's {@link 
SolverManagerConfig}.
      */
-    @ConfigItem
-    public SolverManagerRuntimeConfig solverManager;
+    SolverManagerRuntimeConfig solverManager();
 }
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverManagerRuntimeConfig.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverManagerRuntimeConfig.java
index eef875cf74..ec99d472c7 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverManagerRuntimeConfig.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverManagerRuntimeConfig.java
@@ -24,20 +24,18 @@ import java.util.Optional;
 import org.optaplanner.core.config.solver.SolverManagerConfig;
 
 import io.quarkus.runtime.annotations.ConfigGroup;
-import io.quarkus.runtime.annotations.ConfigItem;
 
 /**
  * During build time, this is translated into OptaPlanner's {@link 
SolverManagerConfig}.
  */
 @ConfigGroup
-public class SolverManagerRuntimeConfig {
+public interface SolverManagerRuntimeConfig {
 
     /**
      * The number of solvers that run in parallel. This directly influences 
CPU consumption.
      * Defaults to {@value SolverManagerConfig#PARALLEL_SOLVER_COUNT_AUTO}.
      * Other options include a number or formula based on the available 
processor count.
      */
-    @ConfigItem
-    public Optional<String> parallelSolverCount;
+    public Optional<String> parallelSolverCount();
 
 }
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverRuntimeConfig.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverRuntimeConfig.java
index 64c7372299..e08ef4c65e 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverRuntimeConfig.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverRuntimeConfig.java
@@ -25,26 +25,23 @@ import org.optaplanner.core.config.solver.SolverConfig;
 import org.optaplanner.core.config.solver.termination.TerminationConfig;
 
 import io.quarkus.runtime.annotations.ConfigGroup;
-import io.quarkus.runtime.annotations.ConfigItem;
 
 /**
  * During run time, this overrides some of OptaPlanner's {@link SolverConfig}
  * properties.
  */
 @ConfigGroup
-public class SolverRuntimeConfig {
+public interface SolverRuntimeConfig {
     /**
      * Enable multithreaded solving for a single problem, which increases CPU 
consumption.
      * Defaults to {@value SolverConfig#MOVE_THREAD_COUNT_NONE}.
      * Other options include {@value SolverConfig#MOVE_THREAD_COUNT_AUTO}, a 
number
      * or formula based on the available processor count.
      */
-    @ConfigItem
-    public Optional<String> moveThreadCount;
+    public Optional<String> moveThreadCount();
 
     /**
      * Configuration properties that overwrite OptaPlanner's {@link 
TerminationConfig}.
      */
-    @ConfigItem
-    public TerminationRuntimeConfig termination;
+    public TerminationRuntimeConfig termination();
 }
diff --git 
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/TerminationRuntimeConfig.java
 
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/TerminationRuntimeConfig.java
index 87f12d204e..12b09dcae3 100644
--- 
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/TerminationRuntimeConfig.java
+++ 
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/TerminationRuntimeConfig.java
@@ -25,35 +25,33 @@ import java.util.Optional;
 import org.optaplanner.core.config.solver.termination.TerminationConfig;
 
 import io.quarkus.runtime.annotations.ConfigGroup;
-import io.quarkus.runtime.annotations.ConfigItem;
 
 /**
  * During build time, this is translated into OptaPlanner's {@link 
TerminationConfig}.
  */
 @ConfigGroup
-public class TerminationRuntimeConfig {
+public interface TerminationRuntimeConfig {
 
     /**
      * How long the solver can run.
      * For example: "30s" is 30 seconds. "5m" is 5 minutes. "2h" is 2 hours. 
"1d" is 1 day.
      * Also supports ISO-8601 format, see {@link Duration}.
      */
-    @ConfigItem
-    public Optional<Duration> spentLimit;
+    Optional<Duration> spentLimit();
+
     /**
      * How long the solver can run without finding a new best solution after 
finding a new best solution.
      * For example: "30s" is 30 seconds. "5m" is 5 minutes. "2h" is 2 hours. 
"1d" is 1 day.
      * Also supports ISO-8601 format, see {@link Duration}.
      */
-    @ConfigItem
-    public Optional<Duration> unimprovedSpentLimit;
+    Optional<Duration> unimprovedSpentLimit();
+
     /**
      * Terminates the solver when a specific or higher score has been reached.
      * For example: "0hard/-1000soft" terminates when the best score changes 
from "0hard/-1200soft" to "0hard/-900soft".
      * Wildcards are supported to replace numbers.
      * For example: "0hard/*soft" to terminate when any feasible score is 
reached.
      */
-    @ConfigItem
-    public Optional<String> bestScoreLimit;
+    Optional<String> bestScoreLimit();
 
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to