quarkusio/quarkus · warning · RuntimeException

Failed to generate the capability error report out of confli

Error message

Failed to generate the capability error report out of conflicts ${conflicts} and unsatisfied ${missing}

What it means

CapabilityErrors.report() writes the conflict and missing-capability problem report into a StringWriter; if that buffered writing throws IOException, it is wrapped in a RuntimeException describing the conflicts and unsatisfied sets. This indicates a failure formatting the capability error report, not the capability problem itself.

Source

Thrown at independent-projects/bootstrap/app-model/src/main/java/io/quarkus/bootstrap/model/CapabilityErrors.java:35

    public void addConflict(String capability, String provider) {
        conflicts.computeIfAbsent(capability, k -> new ArrayList<>()).add(provider);
    }

    public void addMissing(String capability, String consumer) {
        missing.computeIfAbsent(capability, k -> new ArrayList<>()).add(consumer);
    }

    public boolean isEmpty() {
        return conflicts.isEmpty() && missing.isEmpty();
    }

    public String report() {
        final StringWriter sw = new StringWriter();
        try (BufferedWriter writer = new BufferedWriter(sw)) {
            reportProblems(conflicts, false, writer);
            reportProblems(missing, true, writer);
        } catch (IOException e) {
            throw new RuntimeException("Failed to generate the capability error report out of conflicts " + conflicts
                    + " and unsatisfied " + missing, e);
        }
        return sw.getBuffer().toString();
    }

    private static void reportProblems(Map<String, List<String>> problems, boolean missing, BufferedWriter writer)
            throws IOException {
        if (problems.isEmpty()) {
            return;
        }
        if (missing) {
            writer.write(
                    "The following capability requirements aren't satisfied by the Quarkus extensions present on the classpath:");
        } else {
            writer.write("Please make sure there is only one provider of the following capabilities:");
        }
        // To have a consistent report over multiple builds, the capabilities and providers are ordered alphabetically
        final List<String> capabilities = new ArrayList<>(problems.size());

View on GitHub (pinned to e1c734241f)

Solutions

  1. Inspect the cause exception chained in the RuntimeException.
  2. Re-run the application build to regenerate the capability error report.
  3. If reproducible, replace the report generation or upgrade Quarkus — this is a framework-level bug.

Example fix

// before
String report = capabilityErrors.report(); // wrapped RuntimeException
// after
String report;
try {
    report = capabilityErrors.report();
} catch (RuntimeException e) {
    LOG.errorf(e, "Capability conflicts=%s missing=%s", conflicts, missing);
    throw e;
}
Defensive patterns

Strategy: try-catch

Try / catch

try {
    return capabilityErrors.report();
} catch (RuntimeException e) {
    LOG.errorf(e, "Capability report generation failed (conflicts=%s, missing=%s)", conflicts, missing);
    return "conflicts=" + conflicts + "; missing=" + missing; // raw fallback
}

Prevention

When it happens

Trigger: report() called from aggregateCapabilities/conflict or missing-capability validation when BufferedWriter/StringWriter operations raise IOException — practically only an unexpected low-level I/O failure.

Common situations: Extremely rare in practice since StringWriter never throws IOException normally; can appear if the method is overridden/subclassed, or during resource exhaustion (OutOfMemory-like conditions).

Related errors


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