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
- 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').
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
- 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
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
- You have to specify a key. This is the key the user will pre
- You have to specify a description. This is what the user wil
- You have to specify userMessage that will be send to AI, or
- Failed to locate quarkus.extension.deployment-artifact in ${
- Failed to locate META-INF/quarkus.properties in ${runtimeExt
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/3c1c94b6a93ebe2a.
Report an issue: GitHub.