{"record":{"id":"205def1d6c342039","repo":"grpc/grpc-java","slug":"no-functional-channel-service-provider-found-try-205def","errorCode":null,"errorMessage":"No functional channel service provider found. Try adding a dependency on the grpc-okhttp, grpc-netty, or grpc-netty-shaded artifact","messagePattern":"No functional channel service provider found\\. Try adding a dependency on the grpc-okhttp, grpc-netty, or grpc-netty-shaded artifact","errorType":"exception","errorClass":"ProviderNotFoundException","httpStatus":null,"severity":"critical","filePath":"api/src/main/java/io/grpc/ManagedChannelRegistry.java","lineNumber":184,"sourceCode":"          FeatureFlags.getRfc3986UrisEnabled()\n              ? Uri.parse(target).getScheme()\n              : new URI(target).getScheme();\n      nameResolverProvider = nameResolverRegistry.getProviderForScheme(scheme);\n    } catch (URISyntaxException ignore) {\n      // bad URI found, just ignore and continue\n    }\n    if (nameResolverProvider == null) {\n      nameResolverProvider = nameResolverRegistry.getProviderForScheme(\n          nameResolverRegistry.getDefaultScheme());\n    }\n    Collection<Class<? extends SocketAddress>> nameResolverSocketAddressTypes\n        = (nameResolverProvider != null)\n        ? nameResolverProvider.getProducedSocketAddressTypes() :\n        Collections.emptySet();\n\n    List<ManagedChannelProvider> providers = providers();\n    if (providers.isEmpty()) {\n      throw new ProviderNotFoundException(\"No functional channel service provider found. \"\n          + \"Try adding a dependency on the grpc-okhttp, grpc-netty, or grpc-netty-shaded \"\n          + \"artifact\");\n    }\n    StringBuilder error = new StringBuilder();\n    for (ManagedChannelProvider provider : providers()) {\n      Collection<Class<? extends SocketAddress>> channelProviderSocketAddressTypes\n          = provider.getSupportedSocketAddressTypes();\n      if (!channelProviderSocketAddressTypes.containsAll(nameResolverSocketAddressTypes)) {\n        error.append(\"; \");\n        error.append(provider.getClass().getName());\n        error.append(\": does not support 1 or more of \");\n        error.append(Arrays.toString(nameResolverSocketAddressTypes.toArray()));\n        continue;\n      }\n      ManagedChannelProvider.NewChannelBuilderResult result\n          = provider.newChannelBuilder(target, creds, nameResolverRegistry, nameResolverProvider);\n      if (result.getChannelBuilder() != null) {\n        return result.getChannelBuilder();","sourceCodeStart":166,"sourceCodeEnd":202,"githubUrl":"https://github.com/grpc/grpc-java/blob/64daddc1f3d1975670f769f3e97bde8b2ba32d25/api/src/main/java/io/grpc/ManagedChannelRegistry.java#L166-L202","documentation":"ManagedChannelRegistry.newChannelBuilder() builds a channel by iterating all registered ManagedChannelProviders. If the provider list is empty — no transport artifact is on the classpath — it throws ProviderNotFoundException with guidance to add grpc-okhttp, grpc-netty, or grpc-netty-shaded. This is the registry-level path that backs ManagedChannelBuilder.","triggerScenarios":"Calling ManagedChannelBuilder.forTarget()/forAddress() (delegating to newChannelBuilder) or ManagedChannelRegistry.newChannelBuilder(name, defaultPort) when zero ManagedChannelProviders are registered via ServiceLoader.","commonSituations":"Same classpath cause as the provider() throw: missing transport artifact, aggressive dependency exclusion, Android build lacking grpc-okhttp, or a shaded jar that dropped META-INF/services entries.","solutions":["Add io.grpc:grpc-netty-shaded (JVM) or io.grpc:grpc-okhttp (Android) to dependencies","Verify with dependency tree that the transport is not excluded or conflicting in version","In shaded jars, merge service descriptor files (META-INF/services/io.grpc.ManagedChannelProvider)","If a custom provider is intended, ensure its ServiceLoader registration file is packaged correctly"],"exampleFix":"// before (Android)\nimplementation 'io.grpc:grpc-protobuf-lite:1.62.2'\n// after (Android)\nimplementation 'io.grpc:grpc-protobuf-lite:1.62.2'\nimplementation 'io.grpc:grpc-okhttp:1.62.2'","handlingStrategy":"validation","validationCode":"boolean hasProvider = !ManagedChannelRegistry.getDefaultRegistry().providers().isEmpty();\nif (!hasProvider) throw new IllegalStateException(\"No grpc transport on classpath: add grpc-netty-shaded or grpc-okhttp\");","typeGuard":"static boolean canBuildChannel() {\n  try { return ManagedChannelProvider.provider() != null; }\n  catch (ProviderNotFoundException e) { return false; }\n}","tryCatchPattern":"try {\n  ManagedChannelBuilder<?> b = ManagedChannelBuilder.forTarget(target).usePlaintext();\n} catch (ProviderNotFoundException e) {\n  log.error(\"No grpc transport provider; add grpc-netty-shaded or grpc-okhttp dependency\", e);\n  throw e;\n}","preventionTips":["Include a transport dependency in every module that creates channels","Verify transports survive shading via service-file merging","Avoid excluding grpc-* transitive dependencies blindly","Pin one grpc version across the build to keep provider registration consistent"],"tags":["grpc","classpath","dependency","serviceloader","channel-builder"],"backgroundTag":"missing-dependency","analyzedSha":"64daddc1f3d1975670f769f3e97bde8b2ba32d25","analyzedAt":"2026-09-08T06:14:57.704Z","contentChangedAt":"2026-09-08T06:14:57.704Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}