{"record":{"id":"3dd399a213049b0f","repo":"quarkusio/quarkus","slug":"the-agroal-extension-is-missing-and-it-is-required","errorCode":null,"errorMessage":"The Agroal extension is missing and it is required when a Quartz JDBC store is used.","messagePattern":"The Agroal extension is missing and it is required when a Quartz JDBC store is used\\.","errorType":"exception","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"extensions/quartz/deployment/src/main/java/io/quarkus/quartz/deployment/QuartzProcessor.java","lineNumber":135,"sourceCode":"        if (config.storeType().isDbStore()) {\n            return new NativeImageProxyDefinitionBuildItem(Connection.class.getName());\n        }\n        return null;\n    }\n\n    @BuildStep\n    QuartzJDBCDriverDialectBuildItem driver(List<JdbcDataSourceBuildItem> jdbcDataSourceBuildItems,\n            QuartzBuildTimeConfig config, Capabilities capabilities, CombinedIndexBuildItem indexBuildItem) {\n        if (!config.storeType().isDbStore()) {\n            if (config.clustered()) {\n                throw new ConfigurationException(\"Clustered jobs configured with unsupported job store option\");\n            }\n            // No DB storage, the driver can stay empty, and we don't need data sources either\n            return new QuartzJDBCDriverDialectBuildItem(Optional.empty(), null);\n        }\n\n        if (capabilities.isMissing(Capability.AGROAL)) {\n            throw new ConfigurationException(\n                    \"The Agroal extension is missing and it is required when a Quartz JDBC store is used.\");\n        }\n\n        Optional<String> driverDelegate = config.driverDelegate();\n        if (driverDelegate.isPresent()) {\n            // user-specified custom delegate\n            IndexView indexView = indexBuildItem.getIndex();\n            ClassInfo customDelegate = indexView.getClassByName(driverDelegate.get());\n            if (customDelegate == null) {\n                String message = String.format(\n                        \"Custom JDBC delegate implementation class '%s' was not found in Jandex index. \" +\n                                \"Make sure the dependency containing this class has proper marker file enabling discovery. \" +\n                                \"Alternatively, you can index a dependency using IndexDependencyBuildItem.\",\n                        driverDelegate.get());\n                throw new ConfigurationException(message);\n            } else {\n                // any custom implementation needs to be a subclass of known Quarkus delegate\n                boolean implementsKnownDelegate = false;","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/quartz/deployment/src/main/java/io/quarkus/quartz/deployment/QuartzProcessor.java#L117-L153","documentation":"A Quarkus ConfigurationException thrown by the QuartzProcessor driver build step at build time when a Quartz JDBC job store is configured (quarkus.quartz.store-type=jdbc) but the Agroal extension (which provides datasource/Connection pooling) is not present in the application. The JDBC job store needs a datasource to persist job state, so the build fails with this explicit message.","triggerScenarios":"quarkus.quartz.store-type=jdbc (or resolves to a DB store) while the build capabilities check capabilities.isMissing(Capability.AGROAL) is true — i.e. quarkus-agroal / a database driver extension is not among the application dependencies.","commonSituations":"Enabling the JDBC store but forgetting to add the quarkus-agroal (and a quarkus-jdbc-<db> driver) dependency; a dependency was removed or excluded during a refactor; using quarkus-quartz in a minimal app without the datasource extensions.","solutions":["Add the Agroal extension to the project: mvn quarkus:add-extension -Dextensions=\"agroal\" (or add io.quarkus:quarkus-agroal to pom.xml).","Add the matching JDBC driver extension, e.g. quarkus-jdbc-postgresql, and configure quarkus.datasource.jdbc.url / username / password.","If you don't need DB-backed job storage, set quarkus.quartz.store-type=memory instead (and drop clustered=true).","Rebuild and confirm the capability appears via the application's capability list (quarkus insert-dev or build log)."],"exampleFix":"// before (pom.xml)\n<dependency>\n  <groupId>io.quarkus</groupId>\n  <artifactId>quarkus-quartz</artifactId>\n</dependency>\n\n// after\n<dependency>\n  <groupId>io.quarkus</groupId>\n  <artifactId>quarkus-quartz</artifactId>\n</dependency>\n<dependency>\n  <groupId>io.quarkus</groupId>\n  <artifactId>quarkus-agroal</artifactId>\n</dependency>\n<dependency>\n  <groupId>io.quarkus</groupId>\n  <artifactId>quarkus-jdbc-postgresql</artifactId>\n</dependency>","handlingStrategy":"validation","validationCode":"// Verify required extensions are on the classpath before enabling the JDBC store\nString storeType = ConfigProvider.getConfig()\n    .getOptionalValue(\"quarkus.quartz.store-type\", String.class).orElse(\"memory\");\nif (\"jdbc\".equalsIgnoreCase(storeType)) {\n    try {\n        Class.forName(\"io.quarkus.agroal.runtime.AgroalDataSourceSupport\");\n    } catch (ClassNotFoundException e) {\n        throw new IllegalStateException(\n            \"quarkus.quartz.store-type=jdbc requires the quarkus-agroal extension (and a JDBC driver extension)\");\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Add quarkus-agroal and a quarkus-jdbc-<database> extension whenever you set store-type=jdbc.","Use mvn quarkus:add-extension -Dextensions=\"agroal,jdbc-postgresql\" to avoid manual pom edits.","Run a build after dependency cleanup to catch capability checks early rather than in CI.","If DB storage isn't required, keep store-type=memory and avoid the extra extensions."],"tags":["quarkus","quartz","build-time","missing-extension","agroal"],"backgroundTag":"missing-extension-dependency","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"}