grpc/grpc-java · critical · ProviderNotFoundException
No functional channel service provider found. Try adding a d
Error message
No functional channel service provider found. Try adding a dependency on the grpc-okhttp, grpc-netty, or grpc-netty-shaded artifact
What it means
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.
Source
Thrown at api/src/main/java/io/grpc/ManagedChannelRegistry.java:184
FeatureFlags.getRfc3986UrisEnabled()
? Uri.parse(target).getScheme()
: new URI(target).getScheme();
nameResolverProvider = nameResolverRegistry.getProviderForScheme(scheme);
} catch (URISyntaxException ignore) {
// bad URI found, just ignore and continue
}
if (nameResolverProvider == null) {
nameResolverProvider = nameResolverRegistry.getProviderForScheme(
nameResolverRegistry.getDefaultScheme());
}
Collection<Class<? extends SocketAddress>> nameResolverSocketAddressTypes
= (nameResolverProvider != null)
? nameResolverProvider.getProducedSocketAddressTypes() :
Collections.emptySet();
List<ManagedChannelProvider> providers = providers();
if (providers.isEmpty()) {
throw new ProviderNotFoundException("No functional channel service provider found. "
+ "Try adding a dependency on the grpc-okhttp, grpc-netty, or grpc-netty-shaded "
+ "artifact");
}
StringBuilder error = new StringBuilder();
for (ManagedChannelProvider provider : providers()) {
Collection<Class<? extends SocketAddress>> channelProviderSocketAddressTypes
= provider.getSupportedSocketAddressTypes();
if (!channelProviderSocketAddressTypes.containsAll(nameResolverSocketAddressTypes)) {
error.append("; ");
error.append(provider.getClass().getName());
error.append(": does not support 1 or more of ");
error.append(Arrays.toString(nameResolverSocketAddressTypes.toArray()));
continue;
}
ManagedChannelProvider.NewChannelBuilderResult result
= provider.newChannelBuilder(target, creds, nameResolverRegistry, nameResolverProvider);
if (result.getChannelBuilder() != null) {
return result.getChannelBuilder();View on GitHub (pinned to 64daddc1f3)
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
Example fix
// before (Android) implementation 'io.grpc:grpc-protobuf-lite:1.62.2' // after (Android) implementation 'io.grpc:grpc-protobuf-lite:1.62.2' implementation 'io.grpc:grpc-okhttp:1.62.2'
Defensive patterns
Strategy: validation
Validate before calling
boolean hasProvider = !ManagedChannelRegistry.getDefaultRegistry().providers().isEmpty();
if (!hasProvider) throw new IllegalStateException("No grpc transport on classpath: add grpc-netty-shaded or grpc-okhttp"); Type guard
static boolean canBuildChannel() {
try { return ManagedChannelProvider.provider() != null; }
catch (ProviderNotFoundException e) { return false; }
} Try / catch
try {
ManagedChannelBuilder<?> b = ManagedChannelBuilder.forTarget(target).usePlaintext();
} catch (ProviderNotFoundException e) {
log.error("No grpc transport provider; add grpc-netty-shaded or grpc-okhttp dependency", e);
throw e;
} Prevention
- 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
When it happens
Trigger: Calling ManagedChannelBuilder.forTarget()/forAddress() (delegating to newChannelBuilder) or ManagedChannelRegistry.newChannelBuilder(name, defaultPort) when zero ManagedChannelProviders are registered via ServiceLoader.
Common situations: 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.
Understand the failure class
Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.
Related errors
- No functional channel service provider found. Try adding a d
- Unable to load OkHttpChannelProvider
- OkHttpChannelBuilder not found on the classpath
- Not implemented
- No functional server found. Try adding a dependency on the g
AI-assisted analysis of grpc/grpc-java@64daddc1f3 (2026-09-08).
Data as JSON: /api/errors/205def1d6c342039.
Report an issue: GitHub.