quarkusio/quarkus · error · RuntimeException

More than one ClientContextResolver implementation,

Error message

More than one ClientContextResolver implementation, 

What it means

ClientContextResolver uses the JDK ServiceLoader mechanism to locate a single ClientContextResolver implementation on the classpath. If more than one provider is registered (multiple META-INF/services/org.jboss.resteasy.reactive.client.spi.ClientContextResolver files), getInstance throws a RuntimeException naming the two conflicting implementations. Exactly one resolver must be present; with zero, the DefaultClientContext resolver is used as fallback.

Source

Thrown at independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/spi/ClientContextResolver.java:20

import java.util.ServiceLoader;

import org.jboss.resteasy.reactive.client.impl.DefaultClientContext;

public interface ClientContextResolver {

    ClientContext resolve(ClassLoader classLoader);

    static ClientContextResolver getInstance() {
        return getInstance(Thread.currentThread().getContextClassLoader());
    }

    static ClientContextResolver getInstance(ClassLoader classLoader) {
        ServiceLoader<ClientContextResolver> services = ServiceLoader.load(ClientContextResolver.class, classLoader);
        ClientContextResolver selected = null;
        for (ClientContextResolver i : services) {
            if (selected != null) {
                throw new RuntimeException("More than one ClientContextResolver implementation, " + selected + " and " + i);
            }
            selected = i;
        }
        if (selected == null) {
            return DefaultClientContext.RESOLVER;
        }
        return selected;
    }

}

View on GitHub (pinned to e1c734241f)

Solutions

  1. Run `mvn dependency:tree` and exclude the duplicate artifact that brings a second ClientContextResolver service file
  2. If intentionally using Quarkus, remove the standalone resteasy-reactive-client dependency and use quarkus-rest-client instead
  3. Check META-INF/services directories of all jars on the classpath for the resolver file and remove the unwanted one
  4. Align dependency versions via dependencyManagement so only one client runtime is pulled in

Example fix

// before (pom.xml)
<dependency>org.jboss.resteasy.reactive:resteasy-reactive-client</dependency>
<dependency>io.quarkus:quarkus-rest-client</dependency>
// after
<dependency>io.quarkus:quarkus-rest-client</dependency> <!-- alone -->
Defensive patterns

Strategy: validation

Validate before calling

Enumeration<URL> res = cl.getResources("META-INF/services/org.jboss.resteasy.reactive.client.spi.ClientContextResolver");
if (res.hasMoreElements()) {
    // count providers; more than one distinct jar means conflict
    while (res.hasMoreElements()) System.out.println(res.nextElement());
}

Prevention

When it happens

Trigger: Classpath contains two or more service declarations for ClientContextResolver — e.g. both resteasy-reactive-client and a Quarkus-specific client runtime (or two versions of the same jar) are on the classpath when ClientContextResolver.getInstance(classLoader) is invoked.

Common situations: Mixing plain RESTEasy Reactive client dependency with Quarkus REST client extension in a non-Quarkus app; duplicate/transitive dependency versions resolved side-by-side; fat jar/ shaded build bundling two service files.

Related errors


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