quarkusio/quarkus · error · RuntimeException

Failed to locate 'artifact' or 'group-id' and 'artifact-id'

Error message

Failed to locate 'artifact' or 'group-id' and 'artifact-id' among metadata keys ${extensionMapKeySet}

What it means

Dev UI's extension metadata (e.g. from JSON descriptors) is expected to identify the artifact either via the 'artifact' key (Quarkus 2.x GACTV string) or via 'group-id'/'artifact-id' keys (legacy Quarkus 1.x format handled as a fallback). If neither is present in the map, this RuntimeException is thrown. It indicates corrupted or unrecognized extension metadata input.

Source

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

            if (m.containsKey(key)) {
                m.get(key).add(pageBuildItem);
            } else {
                List<UnlistedPageBuildItem> ubi = new ArrayList<>();
                ubi.add(pageBuildItem);
                m.put(key, ubi);
            }
        }
        return m;
    }

    private String getExtensionNamespace(Map<String, Object> extensionMap) {
        final String artifactId;
        final String artifact = (String) extensionMap.get("artifact");
        if (artifact == null) {
            // trying quarkus 1.x format
            artifactId = (String) extensionMap.get("artifact-id");
            if (artifactId == null) {
                throw new RuntimeException(
                        "Failed to locate 'artifact' or 'group-id' and 'artifact-id' among metadata keys "
                                + extensionMap.keySet());
            }
        } else {
            final GACTV coords = GACTV.fromString(artifact);
            artifactId = coords.getArtifactId();
        }
        return artifactId;
    }

    // Sort extensions with Guide first and then alphabetical
    private final Comparator sortingComparator = new Comparator<Extension>() {
        @Override
        public int compare(Extension t, Extension t1) {
            if (t.getGuide() != null && t1.getGuide() != null) {
                return t.getName().compareTo(t1.getName());
            } else if (t.getGuide() == null) {
                return 1;

View on GitHub (pinned to e1c734241f)

Solutions

  1. Ensure the metadata source includes 'artifact' (e.g. group:artifact:classifier:type:version) or at least 'group-id' and 'artifact-id' keys.
  2. Regenerate the extension metadata from the real extension JAR's quarkus.properties instead of hand-maintaining it.
  3. Update the extension/tooling that produced the metadata to a Quarkus-compatible schema.
  4. Inspect the keys listed in the message and fix typos (e.g. 'artifactId' vs 'artifact-id').

Example fix

// before (metadata map)
{"name": "My Ext", "description": "..."}

// after
{"name": "My Ext", "description": "...", "artifact": "com.example:my-ext::jar:1.0.0"}
Defensive patterns

Strategy: validation

Validate before calling

boolean identifiable = metadata.containsKey("artifact")
    || (metadata.containsKey("group-id") && metadata.containsKey("artifact-id"));
if (!identifiable) throw new IllegalArgumentException("Extension metadata missing artifact identification keys");

Try / catch

try { ... } catch (RuntimeException e) {
    if (e.getMessage().contains("Failed to locate 'artifact'")) {
        log.warnf("Ignoring extension metadata without artifact keys: %s", e.getMessage());
    } else throw e;
}

Prevention

When it happens

Trigger: Parsing an extension metadata map during the Dev UI build where extensionMap.get("artifact") is null and extensionMap.get("artifact-id") is also null, while building extension info for display.

Common situations: Feeding Dev UI a custom or third-party extension metadata JSON missing artifact fields; a schema change in the metadata provider; hand-edited extension JSON; testing with mock/fake extension descriptors that omit identification keys.

Related errors


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