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

  1. Identify the artifact from the message and inspect its quarkus-extension.properties / deployment descriptor.
  2. Rebuild the extension (mvn install) if it is locally developed, ensuring the quarkus-extension packaging/processor is correct.
  3. Delete the artifact from ~/.m2/repository and re-download to rule out cache corruption.
  4. 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

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


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