{"record":{"id":"3c1c94b6a93ebe2a","repo":"quarkusio/quarkus","slug":"failed-to-locate-artifact-or-group-id-and-art","errorCode":null,"errorMessage":"Failed to locate 'artifact' or 'group-id' and 'artifact-id' among metadata keys ${extensionMapKeySet}","messagePattern":"Failed to locate 'artifact' or 'group-id' and 'artifact-id' among metadata keys (.+?)","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"extensions/devui/deployment/src/main/java/io/quarkus/devui/deployment/DevUIProcessor.java","lineNumber":1227,"sourceCode":"            if (m.containsKey(key)) {\n                m.get(key).add(pageBuildItem);\n            } else {\n                List<UnlistedPageBuildItem> ubi = new ArrayList<>();\n                ubi.add(pageBuildItem);\n                m.put(key, ubi);\n            }\n        }\n        return m;\n    }\n\n    private String getExtensionNamespace(Map<String, Object> extensionMap) {\n        final String artifactId;\n        final String artifact = (String) extensionMap.get(\"artifact\");\n        if (artifact == null) {\n            // trying quarkus 1.x format\n            artifactId = (String) extensionMap.get(\"artifact-id\");\n            if (artifactId == null) {\n                throw new RuntimeException(\n                        \"Failed to locate 'artifact' or 'group-id' and 'artifact-id' among metadata keys \"\n                                + extensionMap.keySet());\n            }\n        } else {\n            final GACTV coords = GACTV.fromString(artifact);\n            artifactId = coords.getArtifactId();\n        }\n        return artifactId;\n    }\n\n    // Sort extensions with Guide first and then alphabetical\n    private final Comparator sortingComparator = new Comparator<Extension>() {\n        @Override\n        public int compare(Extension t, Extension t1) {\n            if (t.getGuide() != null && t1.getGuide() != null) {\n                return t.getName().compareTo(t1.getName());\n            } else if (t.getGuide() == null) {\n                return 1;","sourceCodeStart":1209,"sourceCodeEnd":1245,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/devui/deployment/src/main/java/io/quarkus/devui/deployment/DevUIProcessor.java#L1209-L1245","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Ensure the metadata source includes 'artifact' (e.g. group:artifact:classifier:type:version) or at least 'group-id' and 'artifact-id' keys.","Regenerate the extension metadata from the real extension JAR's quarkus.properties instead of hand-maintaining it.","Update the extension/tooling that produced the metadata to a Quarkus-compatible schema.","Inspect the keys listed in the message and fix typos (e.g. 'artifactId' vs 'artifact-id')."],"exampleFix":"// before (metadata map)\n{\"name\": \"My Ext\", \"description\": \"...\"}\n\n// after\n{\"name\": \"My Ext\", \"description\": \"...\", \"artifact\": \"com.example:my-ext::jar:1.0.0\"}","handlingStrategy":"validation","validationCode":"boolean identifiable = metadata.containsKey(\"artifact\")\n    || (metadata.containsKey(\"group-id\") && metadata.containsKey(\"artifact-id\"));\nif (!identifiable) throw new IllegalArgumentException(\"Extension metadata missing artifact identification keys\");","typeGuard":null,"tryCatchPattern":"try { ... } catch (RuntimeException e) {\n    if (e.getMessage().contains(\"Failed to locate 'artifact'\")) {\n        log.warnf(\"Ignoring extension metadata without artifact keys: %s\", e.getMessage());\n    } else throw e;\n}","preventionTips":["Generate extension metadata from the JAR descriptor, never by hand","Include both 'artifact' and legacy keys when targeting multiple Quarkus versions","Validate metadata JSON schema in extension CI"],"tags":["devui","metadata","quarkus-extension","validation"],"backgroundTag":"missing-required-metadata-key","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"}