{"record":{"id":"75e41f2743b254c0","repo":"quarkusio/quarkus","slug":"failed-to-load-extension-description","errorCode":null,"errorMessage":"Failed to load extension description ","messagePattern":"Failed to load extension description ","errorType":"exception","errorClass":"UncheckedIOException","httpStatus":null,"severity":"error","filePath":"devtools/gradle/gradle-model/src/main/java/io/quarkus/gradle/tooling/GradleApplicationModelBuilder.java","lineNumber":603,"sourceCode":"        if (providesCapabilities != null) {\n            modelBuilder\n                    .addExtensionCapabilities(\n                            CapabilityContract.of(artifactBuilder.toGACTVString(), providesCapabilities, null));\n        }\n        return true;\n    }\n\n    private static Properties readDescriptor(final Path path) {\n        final Properties rtProps;\n        if (!Files.exists(path)) {\n            // not a platform artifact\n            return null;\n        }\n        rtProps = new Properties();\n        try (BufferedReader reader = Files.newBufferedReader(path)) {\n            rtProps.load(reader);\n        } catch (IOException e) {\n            throw new UncheckedIOException(\"Failed to load extension description \" + path, e);\n        }\n        return rtProps;\n    }\n\n    private static void initProjectModule(Project project, WorkspaceModule.Mutable module, SourceSet sourceSet,\n            String classifier) {\n        if (sourceSet == null) {\n            return;\n        }\n\n        final FileCollection allClassesDirs = sourceSet.getOutput().getClassesDirs();\n        // some plugins do not add source directories to source sets and they may be missing from sourceSet.getAllJava()\n        // see https://github.com/quarkusio/quarkus/issues/20755\n\n        final List<SourceDir> sourceDirs = new ArrayList<>(1);\n        project.getTasks().withType(AbstractCompile.class,\n                t -> configureCompileTask(t.getSource(), t.getDestinationDirectory(), allClassesDirs, sourceDirs, t,\n                        sourceSet));","sourceCodeStart":585,"sourceCodeEnd":621,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/devtools/gradle/gradle-model/src/main/java/io/quarkus/gradle/tooling/GradleApplicationModelBuilder.java#L585-L621","documentation":"Thrown by GradleApplicationModelBuilder.readDescriptor as an UncheckedIOException when loading a Quarkus extension descriptor Properties file (quarkus-extension.properties / quarkus-extension.yaml support path) from the filesystem fails with an IOException. The descriptor path is included in the message. This typically means the extension descriptor file exists at the expected META-INF location but cannot be opened or read.","triggerScenarios":"processQuarkusDir/extProps resolves a descriptor path (inside an expanded directory artifact or extracted META-INF), the file exists (so the null-return guard passes), Files.newBufferedReader(path) succeeds but the subsequent read or the BufferedReader open races with deletion, hits permission denial, or the path is an unreadable directory entry.","commonSituations":"File permission issues on cached artifacts; the descriptor file being deleted/modified concurrently by another build process; filesystem errors (disk issues, NFS mounts); running builds as different users sharing a Gradle/Maven cache with mixed ownership.","solutions":["Check and fix file permissions on the descriptor path reported in the message (readable by the build user).","Remove the containing artifact directory from the cache and rebuild so it is recreated cleanly.","Stop concurrent builds/processes touching the same cache directory, then retry.","If on a shared/NFS cache, move the local repository to local disk (e.g. -Dmaven.repo.local or Gradle cache dir settings).","Inspect the wrapped IOException cause for the precise OS-level reason."],"exampleFix":"# before: Failed to load extension description /cache/io/quarkus/.../META-INF/quarkus-extension.properties\nsudo chown -R $USER ~/.gradle/caches ~/.m2/repository\n# after: rebuild succeeds with readable descriptors","handlingStrategy":"try-catch","validationCode":"// Check descriptor readability before building:\ndef p = file('/path/to/META-INF/quarkus-extension.properties')\nassert p.exists() && p.canRead() : \"Extension descriptor ${p} is missing or unreadable\"","typeGuard":null,"tryCatchPattern":"try {\n    quarkusBuild()\n} catch (UncheckedIOException e) {\n    if (e.message?.startsWith('Failed to load extension description')) {\n        logger.error('Unreadable extension descriptor: ' + e.message + ' / cause: ' + e.cause)\n    } else throw e\n}","preventionTips":["Keep the local Gradle/Maven cache owned by a single build user","Avoid running concurrent builds that share one cache directory","Keep repositories on local disk rather than NFS mounts","On failures, read the wrapped IOException cause to pinpoint the OS-level problem"],"tags":["quarkus","gradle","io","file-read","extension-descriptor"],"backgroundTag":"descriptor-file-read-failed","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"}