quarkusio/quarkus · error · RuntimeException
Failed to collect extension information for ${artifact}
Error message
Failed to collect extension information for ${artifact} What it means
The ApplicationDependencyResolver constructor builds an ExtensionInfo for each extension artifact from its resolved descriptor. If ExtensionInfo's constructor throws BootstrapDependencyProcessingException (e.g. malformed or missing quarkus-extension.properties / descriptor data), it is wrapped in a RuntimeException "Failed to collect extension information for <artifact>".
Source
Thrown at independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/ApplicationDependencyResolver.java:883
private ExtensionInfo getExtensionInfoOrNull(Artifact artifact, List<RemoteRepository> repos) {
if (!artifact.getExtension().equals(ArtifactCoords.TYPE_JAR)) {
return null;
}
ExtensionInfo ext = allExtensions.computeIfAbsent(getKey(artifact), k -> resolveExtensionInfo(artifact, repos));
return ext == EXT_INFO_NONE ? null : ext;
}
private ExtensionInfo resolveExtensionInfo(Artifact artifact, List<RemoteRepository> repos) {
artifact = resolve(artifact, repos);
final Properties descriptor = PathTree.ofDirectoryOrArchive(artifact.getFile().toPath())
.apply(BootstrapConstants.DESCRIPTOR_PATH, ApplicationDependencyResolver::readExtensionProperties);
if (descriptor == null) {
return EXT_INFO_NONE;
}
try {
return new ExtensionInfo(artifact, descriptor, devMode);
} catch (BootstrapDependencyProcessingException e) {
throw new RuntimeException("Failed to collect extension information for " + artifact, e);
}
}
private static Properties readExtensionProperties(PathVisit visit) {
if (visit == null) {
return null;
}
try {
final Properties rtProps = new Properties();
try (BufferedReader reader = Files.newBufferedReader(visit.getPath())) {
rtProps.load(reader);
}
return rtProps;
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
View on GitHub (pinned to e1c734241f)
Solutions
- Identify the artifact from the message and inspect its quarkus-extension.properties / deployment descriptor.
- Rebuild the extension (mvn install) if it is locally developed, ensuring the quarkus-extension packaging/processor is correct.
- Delete the artifact from ~/.m2/repository and re-download to rule out cache corruption.
- If the artifact is not really a Quarkus extension, remove or correct the dependency.
Example fix
// before // extension jar built without the quarkus-extension packaging <packaging>jar</packaging> // after // in the extension's deployment/runtime module <packaging>jar</packaging> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-extension-maven-plugin</artifactId> </dependency> <!-- and configure quarkus-extension:extension-descriptor to emit quarkus-extension.properties -->
Defensive patterns
Strategy: validation
Validate before calling
// Check extension metadata exists before resolution:
try (var zip = new java.util.zip.ZipFile(extArtifact.getFile())) {
if (zip.getEntry("META-INF/quarkus-extension.properties") == null
&& zip.getEntry("META-INF/quarkus-extension.yaml") == null) {
throw new IllegalStateException(extArtifact + " is not a valid Quarkus extension");
}
} Type guard
static boolean hasExtensionMetadata(java.nio.file.Path extensionJar) throws java.io.IOException {
try (var zip = new java.util.zip.ZipFile(extensionJar.toFile())) {
return zip.getEntry("META-INF/quarkus-extension.properties") != null
|| zip.getEntry("META-INF/quarkus-extension.yaml") != null;
}
} Try / catch
try {
resolver.resolve(...);
} catch (RuntimeException e) {
if (e.getMessage().startsWith("Failed to collect extension information for")) {
log.error("Bad extension descriptor for " + e.getMessage().replace("Failed to collect extension information for ", ""), e);
}
throw e;
} Prevention
- Only depend on extensions built with the quarkus-extension-maven-plugin extension-descriptor goal.
- Rebuild locally developed extensions after changing their descriptor configuration.
- Delete and re-download extension artifacts if their cached copy looks corrupted.
When it happens
Trigger: getExtensionInfo in the ApplicationDependencyResolver constructor receives a non-null descriptor but new ExtensionInfo(artifact, descriptor, devMode) fails with BootstrapDependencyProcessingException — e.g. invalid extension descriptor contents or unreadable extension metadata.
Common situations: A jar mislabeled/published as a Quarkus extension without proper quarkus-extension.properties; a hand-built extension with a malformed deployment descriptor; corrupted cached extension artifact in ~/.m2/repository.
Related errors
- Failed to inject extension deployment dependencies for ${app
- both extensionConfiguration and extensionDescriptor are null
- Cannot find deployment project for extension ${extensionArti
- Failed to cache a new instance of io.quarkus.maven.QuarkusMa
- Failed to bootstrap application in ${mode} mode
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/8f3ed52d982c0f00.
Report an issue: GitHub.