quarkusio/quarkus · error · RuntimeException

Failed to locate quarkus.extension.deployment-artifact in ${

Error message

Failed to locate quarkus.extension.deployment-artifact in ${extPropsVisitUrl}

What it means

DevUIProcessor scans extension JARs for META-INF/quarkus.properties, which Quarkus extensions must ship to declare their deployment artifact coordinates. When the properties file exists but does not contain the quarkus.extension.deployment-artifact key, the build step throws this RuntimeException. It signals a malformed or non-compliant extension artifact on the application classpath.

Source

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

        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,
            LaunchModeBuildItem launchModeBuildItem,
            List<DevUIWebJarBuildItem> devUIWebJarBuiltItems,
            BuildProducer<DevUIRoutesBuildItem> devUIRoutesProducer) {

View on GitHub (pinned to e1c734241f)

Solutions

  1. Identify the offending extension from the URL in the message and regenerate/rebuild its JAR with the standard Quarkus extension parent POM so quarkus-maven-plugin populates quarkus.extension.deployment-artifact.
  2. If authoring the descriptor manually, add a line like quarkus.extension.deployment-artifact=groupId:artifactId::jar:version to META-INF/quarkus.properties.
  3. Remove or update the stale extension JAR from the classpath (check local ~/.m2 for outdated snapshots).
  4. Run ./mvnw clean install on the extension module to ensure the descriptor is regenerated rather than copied from a stale build.

Example fix

// before (META-INF/quarkus.properties in extension jar)
quarkus.extension.name=My Ext
quarkus.extension.description=...

// after
quarkus.extension.name=My Ext
quarkus.extension.description=...
quarkus.extension.deployment-artifact=com.example:my-ext-deployment::jar:1.0.0
Defensive patterns

Strategy: validation

Validate before calling

Properties props = new Properties();
try (InputStream is = extPropsVisit.getUrl().openStream()) { props.load(is); }
if (props.getProperty("quarkus.extension.deployment-artifact") == null) {
    throw new IllegalStateException("Extension descriptor missing deployment-artifact: " + extPropsVisit.getUrl());
}

Try / catch

try { ... } catch (RuntimeException e) {
    if (e.getMessage().contains("quarkus.extension.deployment-artifact")) {
        log.warnf("Skipping non-compliant extension: %s", e.getMessage());
    } else throw e;
}

Prevention

When it happens

Trigger: During Dev UI build steps, loading an extension's quarkus.properties succeeds but props.getProperty(BootstrapConstants.PROP_DEPLOYMENT_ARTIFACT) returns null — i.e. the descriptor file is present but missing the deployment-artifact entry.

Common situations: Using a locally built or hand-crafted extension JAR whose quarkus.properties was authored manually and omits the deployment artifact; an extension built with an old or non-Quarkus tooling setup; a repackaged/shaded JAR that stripped the property.

Related errors


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