quarkusio/quarkus · error · RuntimeException

Failed to read ${extPropsVisitUrl}

Error message

Failed to read ${extPropsVisitUrl}

What it means

DevUIProcessor scans extensions' quarkus-extension.properties files (located via ClassPathVisitor/extPropsVisit) to collect deployment build metadata for the Dev UI. This error is thrown when the properties file cannot be read from disk (IOException while opening/reading the path). It indicates a corrupted or inaccessible JAR containing the extension descriptor.

Source

Thrown at extensions/devui/deployment/src/main/java/io/quarkus/devui/deployment/DevUIProcessor.java:1066

                    }
                })
                .build());

        devUIWebJarProducer.produce(new DevUIWebJarBuildItem(deploymentKey, DEVUI));
    }

    private static GACT getDeploymentKey(ResolvedDependency runtimeExt) {
        // Return null instead of throwing when the resource is not found in a given path tree root,
        // so that MultiRootPathTree.apply() can continue searching the remaining roots.
        final GACT result = runtimeExt.getContentTree().apply(BootstrapConstants.DESCRIPTOR_PATH, extPropsVisit -> {
            if (extPropsVisit == null) {
                return null;
            }
            final Properties props = new Properties();
            try (BufferedReader reader = Files.newBufferedReader(extPropsVisit.getPath())) {
                props.load(reader);
            } catch (IOException e) {
                throw new RuntimeException("Failed to read " + extPropsVisit.getUrl(), e);
            }
            final String deploymentCoords = props.getProperty(BootstrapConstants.PROP_DEPLOYMENT_ARTIFACT);
            if (deploymentCoords == null) {
                throw new RuntimeException(
                        "Failed to locate " + BootstrapConstants.PROP_DEPLOYMENT_ARTIFACT + " in " + extPropsVisit.getUrl());
            }
            var coords = GACTV.fromString(deploymentCoords);
            return new GACT(coords.getGroupId(), coords.getArtifactId(), coords.getClassifier(), coords.getType());
        });
        if (result == null) {
            throw new RuntimeException("Failed to locate " + BootstrapConstants.DESCRIPTOR_PATH
                    + " in " + runtimeExt.toCompactCoords());
        }
        return result;
    }

    @BuildStep(onlyIf = IsLocalDevelopment.class)
    void createAllRoutes(WebJarResultsBuildItem webJarResultsBuildItem,

View on GitHub (pinned to e1c734241f)

Solutions

  1. Delete the affected extension artifact from ~/.m2/repository and let Maven re-download it
  2. Run a clean build (./mvnw clean install) to refresh classpath entries
  3. Check the cause (IOException) for the exact path and fix filesystem permissions if applicable
  4. Inspect the quarkus-extension.properties URL printed in the message to identify which extension's JAR is broken

Example fix

null
Defensive patterns

Strategy: try-catch

Validate before calling

Path p = extPropsVisit.getPath();
if (p == null || !Files.isReadable(p)) {
    throw new IllegalStateException("Extension properties file not readable: " + p);
}

Try / catch

try {
    props.load(Files.newBufferedReader(extPropsVisit.getPath()));
} catch (IOException e) {
    log.warn("Skipping unreadable extension descriptor " + extPropsVisit.getUrl() + ": " + e.getMessage());
}

Prevention

When it happens

Trigger: Files.newBufferedReader(extPropsVisit.getPath()) throws IOException because the JAR/entry is unreadable — e.g. a truncated or corrupted artifact in the local Maven repository, permission problems, or a broken classpath entry.

Common situations: Interrupted downloads leaving partial JARs in ~/.m2/repository; file permissions blocking read in CI containers; working in a project with duplicate/conflicting extension versions where a stale artifact is referenced.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/6e019cafe2fdcd14. Report an issue: GitHub.