2626import io .quarkus .gizmo .ClassOutput ;
2727import io .quarkus .gizmo .MethodCreator ;
2828import io .quarkus .gizmo .MethodDescriptor ;
29- import io .quarkus .kubernetes . client . spi . KubernetesClientBuildItem ;
29+ import io .quarkus .deployment . builditem . nativeimage . ReflectiveClassBuildItem ;
3030import java .lang .reflect .Modifier ;
3131import java .util .List ;
3232import java .util .Optional ;
@@ -63,21 +63,21 @@ void indexSDKDependencies(BuildProducer<IndexDependencyBuildItem> indexDependenc
6363 }
6464
6565 @ BuildStep
66- @ Record (ExecutionTime .RUNTIME_INIT )
66+ @ Record (ExecutionTime .STATIC_INIT )
6767 void createConfigurationServiceAndOperator (
6868 CombinedIndexBuildItem combinedIndexBuildItem ,
6969 BuildProducer <GeneratedClassBuildItem > generatedClass ,
7070 BuildProducer <SyntheticBeanBuildItem > syntheticBeanBuildItemBuildProducer ,
7171 BuildProducer <AdditionalBeanBuildItem > additionalBeans ,
72- KubernetesClientBuildItem clientBuildItem ,
72+ BuildProducer < ReflectiveClassBuildItem > reflectionClasses ,
7373 ConfigurationServiceRecorder recorder ) {
7474 final var index = combinedIndexBuildItem .getIndex ();
7575 final var resourceControllers = index .getAllKnownImplementors (RESOURCE_CONTROLLER );
7676
7777 final var classOutput = new GeneratedClassGizmoAdaptor (generatedClass , true );
7878 final List <ControllerConfiguration > controllerConfigs =
7979 resourceControllers .stream ()
80- .map (ci -> createControllerConfiguration (ci , classOutput , additionalBeans ))
80+ .map (ci -> createControllerConfiguration (ci , classOutput , additionalBeans , reflectionClasses ))
8181 .collect (Collectors .toList ());
8282
8383 final var supplier = recorder .configurationServiceSupplier (controllerConfigs );
@@ -95,7 +95,8 @@ void createConfigurationServiceAndOperator(
9595 private ControllerConfiguration createControllerConfiguration (
9696 ClassInfo info ,
9797 ClassOutput classOutput ,
98- BuildProducer <AdditionalBeanBuildItem > additionalBeans ) {
98+ BuildProducer <AdditionalBeanBuildItem > additionalBeans ,
99+ BuildProducer <ReflectiveClassBuildItem > reflectionClasses ) {
99100 // first retrieve the custom resource class
100101 final var rcInterface =
101102 info .interfaceTypes ().stream ()
@@ -147,9 +148,18 @@ private ControllerConfiguration createControllerConfiguration(
147148 + Controller .class .getCanonicalName ()
148149 + " annotation" );
149150 }
151+
152+ // load CR class
153+ final Class <CustomResource > crClass = (Class <CustomResource >) loadClass (crType );
154+
155+ // register CR class for introspection
156+ reflectionClasses .produce (new ReflectiveClassBuildItem (true , true , crClass ));
157+
150158 final var crdName =
151159 valueOrDefault (
152160 controllerAnnotation , "crdName" , AnnotationValue ::asString , EXCEPTION_SUPPLIER );
161+
162+ // create the configuration
153163 final var configuration =
154164 new QuarkusControllerConfiguration (
155165 resourceControllerClassName ,
@@ -193,4 +203,12 @@ private <T> T valueOrDefault(
193203 Supplier <T > defaultValue ) {
194204 return Optional .ofNullable (annotation .value (name )).map (converter ).orElseGet (defaultValue );
195205 }
206+
207+ private Class <?> loadClass (String className ) {
208+ try {
209+ return Thread .currentThread ().getContextClassLoader ().loadClass (className );
210+ } catch (ClassNotFoundException e ) {
211+ throw new IllegalArgumentException ("Couldn't find class " + className );
212+ }
213+ }
196214}
0 commit comments