{"record":{"id":"5d7627177ffdb1b1","repo":"quarkusio/quarkus","slug":"build-metrics-file-cannot-be-read","errorCode":null,"errorMessage":"Build metrics file cannot be read: ","messagePattern":"Build metrics file cannot be read: ","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"devtools/cli/src/main/java/io/quarkus/cli/BuildReport.java","lineNumber":34,"sourceCode":"import tools.jackson.databind.node.NullNode;\n\n@CheckedTemplate(basePath = \"\")\npublic class BuildReport {\n\n    static native TemplateInstance buildReport(String buildTarget, long duration, Set<String> threads,\n            List<BuildStepRecord> records, List<BuildItem> buildItems, int buildItemsCount);\n\n    private final BuildSystemRunner runner;\n\n    public BuildReport(BuildSystemRunner runner) {\n        this.runner = runner;\n    }\n\n    File generate() throws IOException {\n        File metricsJsonFile = runner.getProjectRoot().resolve(runner.getBuildTool().getBuildDirectory())\n                .resolve(\"build-metrics.json\").toFile();\n        if (!metricsJsonFile.canRead()) {\n            throw new IllegalStateException(\"Build metrics file cannot be read: \" + metricsJsonFile);\n        }\n\n        ObjectMapper objectMapper = new ObjectMapper();\n        JsonNode root = objectMapper.readTree(metricsJsonFile);\n\n        String buildTarget = root.get(\"buildTarget\").asText();\n        long duration = root.get(\"duration\").asLong();\n        Set<String> threads = new HashSet<>();\n        List<BuildStepRecord> records = new ArrayList<>();\n        List<BuildItem> items = new ArrayList<>();\n        int itemsCount = root.get(\"itemsCount\").asInt();\n\n        for (JsonNode record : root.get(\"records\")) {\n            String thread = record.get(\"thread\").asText();\n            threads.add(thread);\n            List<BuildItem> producedItems = List.of();\n            JsonNode produced = record.get(\"producedItems\");\n            if (produced != null && !(produced instanceof NullNode)) {","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/devtools/cli/src/main/java/io/quarkus/cli/BuildReport.java#L16-L52","documentation":"quarkus build --report (BuildReport.generate) reads <buildDir>/build-metrics.json produced by the build tool; if the file is absent or unreadable it throws IllegalStateException 'Build metrics file cannot be read: <path>'. The report generation requires metrics emitted by the preceding build.","triggerScenarios":"Running the build-report command/request without a prior successful build that wrote build-metrics.json, running from the wrong project root/build tool, or deleting the target/build directory before generating the report.","commonSituations":"Forgetting to build first; running report generation after `mvn clean`; project root misdetected (running CLI outside the project directory); build tool's build directory customized.","solutions":["Run the build first (e.g. ./mvnw package or gradlew build) so build-metrics.json is generated, then generate the report","Verify you run the command from the project root so the metrics path resolves correctly","Check that <buildDir>/build-metrics.json exists and is readable (ls/target/build dir)","Ensure the build tool's build directory hasn't been customized without updating expectations"],"exampleFix":"# before: report without build\n./quarkus build --report   # fails, no build-metrics.json\n# after\n./mvnw package -DskipTests && ./quarkus build --report","handlingStrategy":"validation","validationCode":"File metrics = new File(buildDir, \"build-metrics.json\");\nif (!metrics.canRead()) throw new IllegalStateException(\"Build first so build-metrics.json exists at \" + metrics);","typeGuard":null,"tryCatchPattern":"try { report.generate(); } catch (IllegalStateException e) { if (e.getMessage().startsWith(\"Build metrics file cannot be read\")) System.err.println(\"Run the build before generating a report\"); else throw e; }","preventionTips":["Always run the build before requesting --report","Do not clean the build directory between build and report generation","Run CLI commands from the project root"],"tags":["cli","build-report","io"],"backgroundTag":"build-metrics-missing","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}