{"record":{"id":"07a69a98a9a45ad5","repo":"quarkusio/quarkus","slug":"failed-to-persist-extension-descriptor-output-re","errorCode":null,"errorMessage":"Failed to persist extension descriptor ${output.resolve(BootstrapConstants.DESCRIPTOR_FILE_NAME)}","messagePattern":"Failed to persist extension descriptor (.+?)","errorType":"exception","errorClass":"MojoExecutionException","httpStatus":null,"severity":"error","filePath":"independent-projects/extension-maven-plugin/src/main/java/io/quarkus/maven/ExtensionDescriptorMojo.java","lineNumber":298,"sourceCode":"        props.setProperty(BootstrapConstants.PROP_DEPLOYMENT_ARTIFACT, deployment);\n\n        recordConditionalDeps(props);\n        recordCapabilities(props);\n        recordClassLoadingConfig(props);\n        recordDevModeConfig(props);\n\n        final String quarkusCoreVersion = findQuarkusCoreVersion();\n        final String quarkusCoreVersionRange = requiresQuarkusCore == null ? toVersionRange(quarkusCoreVersion)\n                : requiresQuarkusCore;\n        if (quarkusCoreVersionRange != null) {\n            props.put(\"requires-quarkus-version\", quarkusCoreVersionRange);\n        }\n        final Path output = outputDirectory.toPath().resolve(BootstrapConstants.META_INF);\n        try {\n            Files.createDirectories(output);\n            PropertyUtils.store(props, output.resolve(BootstrapConstants.DESCRIPTOR_FILE_NAME));\n        } catch (IOException e) {\n            throw new MojoExecutionException(\n                    \"Failed to persist extension descriptor \" + output.resolve(BootstrapConstants.DESCRIPTOR_FILE_NAME),\n                    e);\n        }\n\n        // extension.json\n        if (extensionFile == null) {\n            extensionFile = output.resolve(BootstrapConstants.QUARKUS_EXTENSION_FILE_NAME).toFile();\n        }\n\n        ObjectNode extObject;\n        if (!extensionFile.exists()) {\n            // if does not exist look for fallback .json\n            extensionFile = new File(extensionFile.getParent(), \"quarkus-extension.json\");\n        }\n\n        ObjectMapper mapper = null;\n        if (extensionFile.exists()) {\n            mapper = getMapper(extensionFile.toString().endsWith(\".yaml\"));","sourceCodeStart":280,"sourceCodeEnd":316,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/extension-maven-plugin/src/main/java/io/quarkus/maven/ExtensionDescriptorMojo.java#L280-L316","documentation":"ExtensionDescriptorMojo.generate() writes the quarkus-extension.properties descriptor into target/classes/META-INF via PropertyUtils.store after creating the directory. Any IOException while creating directories or persisting the file is wrapped in a MojoExecutionException naming the descriptor file path.","triggerScenarios":"Files.createDirectories or PropertyUtils.store throws IOException — read-only target directory, disk full, a META-INF path that exists as a regular file, or permission denied during the extension descriptor goal.","commonSituations":"Disk quota exceeded on CI; target/ locked by another process or container volume mounted read-only; stale target state where META-INF is a file instead of a directory; running the build as an unprivileged user.","solutions":["Check free disk space and clean up if full (mvn clean or df -h)","Remove a stale META-INF file that blocks directory creation, then mvn clean","Fix permissions/ownership of the target directory","Retry the build once transient I/O issues (NFS/network mounts) are resolved"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"Path metaInf = targetDir.resolve(\"classes/META-INF\");\nif (metaInf.exists() && !metaInf.isDirectory()) Files.delete(metaInf);\nif (metaInf.getParent().isDirectory() && !metaInf.getParent().canWrite()) throw new IllegalStateException(\"target not writable\");","typeGuard":null,"tryCatchPattern":"try {\n  invoker.executeMaven(\"extension-descriptor\");\n} catch (MojoExecutionException e) {\n  if (String.valueOf(e.getCause()).contains(\"persist extension descriptor\")) {\n    runMaven(\"clean\"); invoker.executeMaven(\"extension-descriptor\");\n  } else throw e;\n}","preventionTips":["Keep disk headroom on CI runners; monitor quota","Run mvn clean when switching branches or JDK versions","Avoid read-only mounts over target/ in containerized builds","Don't run parallel builds writing to the same module's target"],"tags":["maven-plugin","io","filesystem","extension-descriptor"],"backgroundTag":"file-write-failed","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"}