{"record":{"id":"d0c9357c693fdd08","repo":"quarkusio/quarkus","slug":"thread-pool-class-not-found-threadpoolclass","errorCode":null,"errorMessage":"Thread pool class not found: ${threadPoolClass}","messagePattern":"Thread pool class not found: (.+?)","errorType":"exception","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"extensions/quartz/deployment/src/main/java/io/quarkus/quartz/deployment/QuartzProcessor.java","lineNumber":249,"sourceCode":"            reflectiveClasses.add(ReflectiveClassBuildItem.builder(\n                    String.class,\n                    JobDataMap.class,\n                    DirtyFlagMap.class,\n                    StringKeyDirtyFlagMap.class,\n                    HashMap.class)\n                    .reason(getClass().getName())\n                    .serialization(true).build());\n        }\n\n        Class<?> threadPoolClass;\n        try {\n            threadPoolClass = Class.forName(config.threadPoolClass(), false, Thread.currentThread().getContextClassLoader());\n            if (!ThreadPool.class.isAssignableFrom(threadPoolClass)) {\n                throw new ConfigurationException(\n                        \"Thread pool class does not implement ThreadPool interface spi: \" + config.threadPoolClass());\n            }\n        } catch (ClassNotFoundException e) {\n            throw new ConfigurationException(\"Thread pool class not found: \" + config.threadPoolClass());\n        }\n\n        reflectiveClasses.add(ReflectiveClassBuildItem.builder(threadPoolClass, SimpleInstanceIdGenerator.class)\n                .reason(getClass().getName())\n                .methods().build());\n        reflectiveClasses\n                .add(ReflectiveClassBuildItem.builder(CascadingClassLoadHelper.class, InitThreadContextClassLoadHelper.class)\n                        .reason(getClass().getName())\n                        .build());\n        reflectiveClasses.add(ReflectiveClassBuildItem.builder(config.storeType().clazz)\n                .reason(getClass().getName())\n                .methods().fields().build());\n\n        if (config.storeType().isDbStore()) {\n            reflectiveClasses.add(ReflectiveClassBuildItem.builder(\n                    JobStoreSupport.class,\n                    AbstractTrigger.class,\n                    SimpleTriggerImpl.class,","sourceCodeStart":231,"sourceCodeEnd":267,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/quartz/deployment/src/main/java/io/quarkus/quartz/deployment/QuartzProcessor.java#L231-L267","documentation":"Quarkus Quartz deployment validates the custom thread pool class configured via quarkus.quartz.thread-pool.class by loading it with Class.forName at build time. When the class cannot be found on the application classpath, a ConfigurationException with this message is thrown, failing the build. This guard exists so Quartz can instantiate the pool and register it for reflection (native image support).","triggerScenarios":"Set quarkus.quartz.thread-pool.class to a class name that is not on the application's classpath at build time (typo, missing dependency, wrong package, class only available at runtime).","commonSituations":"Typo in the fully-qualified class name; custom ThreadPool implementation lives in a module not declared as a dependency; class was renamed/moved during a Quartz or app upgrade; using a library thread pool class excluded from the Quarkus app.","solutions":["Verify the fully-qualified class name in quarkus.quartz.thread-pool.class (check spelling and package).","Add the artifact containing the ThreadPool implementation as a dependency of the application.","Ensure the class implements org.quarkus... org.quartz.spi.ThreadPool (the next validation would reject it otherwise).","If no custom pool is needed, remove the property to fall back to the default thread pool."],"exampleFix":"// before (application.properties)\nquarkus.quartz.thread-pool.class=com.myapp.CustomPool\n\n// after (correct FQN + dependency present)\nquarkus.quartz.thread-pool.class=com.myapp.quartz.CustomThreadPool","handlingStrategy":"validation","validationCode":"// build-time check: ensure the class is loadable and implements ThreadPool\nString fqn = \"com.myapp.quartz.CustomThreadPool\"; // value of quarkus.quartz.thread-pool.class\ntry {\n    Class<?> c = Class.forName(fqn, false, Thread.currentThread().getContextClassLoader());\n    if (!org.quartz.spi.ThreadPool.class.isAssignableFrom(c)) {\n        throw new IllegalStateException(fqn + \" must implement org.quartz.spi.ThreadPool\");\n    }\n} catch (ClassNotFoundException e) {\n    throw new IllegalStateException(\"thread-pool class not on classpath: \" + fqn, e);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep the custom ThreadPool in a module that is a compile+runtime dependency of the app.","Reference the class via Class literal where possible to catch typos at compile time.","Run a build before deploying; this error surfaces at build time, not runtime."],"tags":["quarkus","quartz","build-time","configuration","classpath"],"backgroundTag":"class-not-found-on-classpath","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}