{"record":{"id":"a4c8c762bf5f414f","repo":"quarkusio/quarkus","slug":"more-than-one-clientcontextresolver-implementation","errorCode":null,"errorMessage":"More than one ClientContextResolver implementation, ","messagePattern":"More than one ClientContextResolver implementation, ","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/spi/ClientContextResolver.java","lineNumber":20,"sourceCode":"\nimport java.util.ServiceLoader;\n\nimport org.jboss.resteasy.reactive.client.impl.DefaultClientContext;\n\npublic interface ClientContextResolver {\n\n    ClientContext resolve(ClassLoader classLoader);\n\n    static ClientContextResolver getInstance() {\n        return getInstance(Thread.currentThread().getContextClassLoader());\n    }\n\n    static ClientContextResolver getInstance(ClassLoader classLoader) {\n        ServiceLoader<ClientContextResolver> services = ServiceLoader.load(ClientContextResolver.class, classLoader);\n        ClientContextResolver selected = null;\n        for (ClientContextResolver i : services) {\n            if (selected != null) {\n                throw new RuntimeException(\"More than one ClientContextResolver implementation, \" + selected + \" and \" + i);\n            }\n            selected = i;\n        }\n        if (selected == null) {\n            return DefaultClientContext.RESOLVER;\n        }\n        return selected;\n    }\n\n}\n","sourceCodeStart":2,"sourceCodeEnd":31,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/spi/ClientContextResolver.java#L2-L31","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before (pom.xml)\n<dependency>org.jboss.resteasy.reactive:resteasy-reactive-client</dependency>\n<dependency>io.quarkus:quarkus-rest-client</dependency>\n// after\n<dependency>io.quarkus:quarkus-rest-client</dependency> <!-- alone -->","handlingStrategy":"validation","validationCode":"Enumeration<URL> res = cl.getResources(\"META-INF/services/org.jboss.resteasy.reactive.client.spi.ClientContextResolver\");\nif (res.hasMoreElements()) {\n    // count providers; more than one distinct jar means conflict\n    while (res.hasMoreElements()) System.out.println(res.nextElement());\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["serviceloader","classpath","dependency-conflict","resteasy-reactive-client"],"backgroundTag":"duplicate-serviceloader-provider","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}