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
- Run `mvn dependency:tree` and exclude the duplicate artifact that brings a second ClientContextResolver service file
- If intentionally using Quarkus, remove the standalone resteasy-reactive-client dependency and use quarkus-rest-client instead
- Check META-INF/services directories of all jars on the classpath for the resolver file and remove the unwanted one
- 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
- Run `mvn dependency:tree` regularly to catch duplicate client runtimes
- Do not mix quarkus-rest-client with standalone resteasy-reactive-client
- Check for duplicate META-INF/services files in shaded/fat jars
- Pin one version of RESTEasy Reactive in dependencyManagement
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
- Multiple RestClientBuilderFactory implementations found: ${s
- Multiple HealthCheckResponseProvider implementations found:
- Failed to load registry client factory from ${url}
- Expected : after attribute
- Failed to load CodeGenProvider class from deployment classlo
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/a4c8c762bf5f414f.
Report an issue: GitHub.