{"record":{"id":"cf9408fb66403f94","repo":"quarkusio/quarkus","slug":"failed-to-load-steps-from-s","errorCode":null,"errorMessage":"Failed to load steps from %s","messagePattern":"Failed to load steps from (.+?)","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"critical","filePath":"core/deployment/src/main/java/io/quarkus/deployment/ExtensionLoader.java","lineNumber":160,"sourceCode":"        // BooleanSupplier factory\n        result = result.andThen(bcb -> bcb.addBuildStep(new io.quarkus.builder.BuildStep() {\n\n            @Override\n            public void execute(BuildContext context) {\n                context.produce(bsf);\n            }\n\n            @Override\n            public String getId() {\n                return ExtensionLoader.class.getName() + \"#booleanSupplierFactory\";\n            }\n        }).produces(BooleanSupplierFactoryBuildItem.class).build());\n\n        for (Class<?> clazz : ServiceUtil.classesNamedIn(classLoader, \"META-INF/quarkus-build-steps.list\")) {\n            try {\n                result = result.andThen(ExtensionLoader.loadStepsFromClass(clazz, bsf));\n            } catch (Throwable e) {\n                throw new RuntimeException(\"Failed to load steps from \" + clazz, e);\n            }\n        }\n\n        result = result.andThen(bcb -> bcb.addBuildStep(new io.quarkus.builder.BuildStep() {\n\n            @Override\n            public void execute(BuildContext bc) {\n                bc.produce(new ConfigurationBuildItem(readResult));\n\n                ObjectLoader valueRegistryLoader = new ObjectLoader() {\n                    @Override\n                    public ResultHandle load(BytecodeCreator body, Object obj, Class<?> type, boolean staticInit) {\n                        // What we get here is the body of io.quarkus.runtime.StartupTask.deploy method\n                        // with StartupContext, but is it always like this?\n                        MethodCreator methodCreator = (MethodCreator) body;\n                        MethodDescriptor getValue = MethodDescriptor.ofMethod(StartupContext.class, \"getValue\", Object.class,\n                                String.class);\n","sourceCodeStart":142,"sourceCodeEnd":178,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/core/deployment/src/main/java/io/quarkus/deployment/ExtensionLoader.java#L142-L178","documentation":"RuntimeException thrown by ExtensionLoader.loadStepsFrom when loading build step classes listed in META-INF/quarkus-build-steps.list fails: ExtensionLoader.loadStepsFromClass(clazz) threw any Throwable. This happens while assembling the extension's build steps during deployment processing — a broken build-step class (missing methods, linkage errors, exception in static init/annotation processing) aborts the Quarkus augmentation.","triggerScenarios":"loadStepsFrom iterates classesNamedIn(classLoader, \"META-INF/quarkus-build-steps.list\") and calls loadStepsFromClass for each; a NoClassDefFoundError for a type referenced by a build-step method, NoSuchMethodError from mismatched extension versions, or any exception during method scanning produces 'Failed to load steps from <clazz>'.","commonSituations":"Mixed Quarkus extension versions on the build classpath (BOM mismatch); an extension deployment jar compiled against a different Quarkus core version; a build step referencing classes not on the deployment classpath (classloading violation); stale incremental-build state after a Quarkus upgrade.","solutions":["Align all Quarkus extensions to one BOM/version (mvn dependency:tree to find mismatches) and rebuild","Run a clean build to flush stale augmentation state after a Quarkus upgrade","Inspect the 'Caused by' for NoClassDefFoundError/NoSuchMethodError and add/fix the missing dependency","If you author the extension, ensure build-step classes only reference classes available in the deployment module"],"exampleFix":"// before: mixed versions in pom.xml\n<quarkus.platform.version>3.14.0</quarkus.platform.version>\n<quarkus.extension.version>2.16.0.Final</quarkus.extension.version>\n// after: single platform import\n<dependency>\n  <groupId>io.quarkus.platform</groupId>\n  <artifactId>quarkus-bom</artifactId>\n  <version>3.14.0</version>\n  <type>pom</type>\n</dependency>","handlingStrategy":"try-catch","validationCode":"// Detect version drift among Quarkus artifacts before building\nmvn dependency:tree -Dincludes=io.quarkus,io.quarkiverse.* | grep quarkus\n// All io.quarkus artifacts must share one version; fail if not","typeGuard":null,"tryCatchPattern":"for (Class<?> clazz : ServiceUtil.classesNamedIn(classLoader, \"META-INF/quarkus-build-steps.list\")) {\n    try {\n        result = result.andThen(ExtensionLoader.loadStepsFromClass(clazz, bsf));\n    } catch (Throwable e) {\n        Throwable r = e;\n        while (r.getCause() != null) r = r.getCause();\n        throw new IllegalStateException(\"Fix extension version/classpath for \" + clazz.getName() + \": \" + r, e);\n    }\n}","preventionTips":["Import a single Quarkus platform BOM; never pin individual extension versions manually","Clean build after every Quarkus upgrade","Keep deployment-only dependencies out of runtime modules","Run mvn dependency:tree in CI to catch version drift"],"tags":["quarkus","build-steps","extension","classloading"],"backgroundTag":"extension-version-mismatch","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"}