quarkusio/quarkus · error · IllegalArgumentException

Extension ${extension} was configured to require a capabilit

Error message

Extension ${extension} was configured to require a capability with an empty name: ${requiresStr}

What it means

CapabilityContract.of() also validates the 'requires' capability list; any empty capability name in the requires string throws IllegalArgumentException. This keeps capability dependency metadata well-formed so conflict/missing-capability resolution works correctly.

Source

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

     */
    @Deprecated(forRemoval = true)
    public static CapabilityContract providesCapabilities(String extension, String commaSeparatedList) {
        return of(extension, commaSeparatedList, null);
    }

    public static CapabilityContract of(String extension, String providesStr, String requiresStr) {

        final Collection<String> provides = parseCapabilities(providesStr);
        for (String name : provides) {
            if (name.isEmpty()) {
                throw new IllegalArgumentException("Extension " + extension
                        + " was configured to provide a capability with an empty name: " + providesStr);
            }
        }
        final Collection<String> requires = parseCapabilities(requiresStr);
        for (String name : requires) {
            if (name.isEmpty()) {
                throw new IllegalArgumentException("Extension " + extension
                        + " was configured to require a capability with an empty name: " + requiresStr);
            }
        }

        return new CapabilityContract(extension, provides, requires);
    }

    private static Collection<String> parseCapabilities(String s) {
        return s == null || s.isBlank() ? List.of() : Arrays.asList(capabilitiesPattern.split(s));
    }

    private final String extension;
    private final Collection<String> providesCapabilities;
    private final Collection<String> requiresCapabilities;

    /**
     * @deprecated in favor of {@link #CapabilityContract(String, Collection, Collection)}
     *

View on GitHub (pinned to e1c734241f)

Solutions

  1. Fix the requires string so it contains only non-empty comma-separated capability names.
  2. Sanitize input: split on comma, trim, filter blank entries before calling of().
  3. Locate which extension declares the malformed requires list and correct its build metadata.

Example fix

// before
CapabilityContract.of("my-ext", "io.quarkus.jpa", "io.quarkus.datasource,");
// after
String requires = Stream.of("io.quarkus.datasource,")
        .map(String::trim).filter(s -> !s.isEmpty())
        .collect(Collectors.joining(","));
CapabilityContract.of("my-ext", "io.quarkus.jpa", requires);
Defensive patterns

Strategy: validation

Validate before calling

boolean valid = Arrays.stream(requiresStr.split(","))
        .map(String::trim)
        .allMatch(s -> !s.isEmpty());
if (!valid) throw new IllegalArgumentException("requires contains empty capability name: " + requiresStr);

Try / catch

try {
    return CapabilityContract.of(ext, provides, requires);
} catch (IllegalArgumentException e) {
    throw new IllegalStateException("Malformed requires-capabilities for " + ext, e);
}

Prevention

When it happens

Trigger: Calling CapabilityContract.of(extension, providesStr, requiresStr) where requiresStr parses to an empty name — e.g. trailing comma 'a,b,', double comma, or a whitespace-only segment.

Common situations: Hand-edited quarkus.requires-capabilities values in extension descriptors, generated strings with empty items from list joining, copy-paste of capability lists.

Related errors


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