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
- 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.
- If authoring the descriptor manually, add a line like quarkus.extension.deployment-artifact=groupId:artifactId::jar:version to META-INF/quarkus.properties.
- Remove or update the stale extension JAR from the classpath (check local ~/.m2 for outdated snapshots).
- 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
- Always build extensions with the Quarkus extension parent POM so the descriptor is generated
- Verify extension JARs contain quarkus.extension.deployment-artifact before publishing
- Keep runtime and deployment artifacts version-aligned via the Quarkus BOM
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
- Could not determine constructor for ${theClass} add @Inject
- Cannot inject object of type ${param}
- Failed to prepare injector constructor ${injectCtor} of byte
- Unsupported value: ${value}
- Cannot create new DeferredArrayStoreParameter after array ha
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/daf0c03d90701816.
Report an issue: GitHub.