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

  1. Add io.grpc:grpc-netty-shaded (JVM) or io.grpc:grpc-okhttp (Android) to dependencies
  2. Verify with dependency tree that the transport is not excluded or conflicting in version
  3. In shaded jars, merge service descriptor files (META-INF/services/io.grpc.ManagedChannelProvider)
  4. 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

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


AI-assisted analysis of grpc/grpc-java@64daddc1f3 (2026-09-08). Data as JSON: /api/errors/205def1d6c342039. Report an issue: GitHub.