2019/06/24
io.grpc.ManagedChannelProvider$ProviderNotFoundException が発生した時の対処方法
Google Photos API の Java クライアントライブラリを使おうとしたところ、以下のようなエラーが出てしまいました。
io.grpc.ManagedChannelProvider$ProviderNotFoundException: No functional channel service provider found. Try adding a dependency on the grpc-okhttp, grpc-netty, or grpc-netty-shaded artifact
Try adding a dependency on the grpc-okhttp, grpc-netty, or grpc-netty-shaded artifact
とのことなので ManagedChannelProvider
の実装が必要なことはわかりました。
が、「どうやって指定するのよ…」と悩むこと小一時間。
解決方法
結論から言うと、特に Java のコードですることはなく、依存ライブラリを指定してやればよいだけでした。 例えば、gradle なら以下の1行を追加するだけです1。
1 2 3 | dependencies { implementation 'io.grpc:grpc-okhttp:1.21.0' } |
結局、エラーメッセージの指示通りにすれば良かったというオチでした。
リフレクションを使ってた
ManagedChannelProvider のコードを見ると、ManagedChannelProvider
の実装を実行時に探していることがわかります。
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | private static final ManagedChannelProvider provider = ServiceProviders.load( ManagedChannelProvider. class , HARDCODED_CLASSES, ManagedChannelProvider. class .getClassLoader(), new PriorityAccessor<managedchannelprovider>() { @Override public boolean isAvailable(ManagedChannelProvider provider) { return provider.isAvailable(); } @Override public int getPriority(ManagedChannelProvider provider) { return provider.priority(); } }); |
最適化している場合は注意
上記のようにリフレクションを使っているので、 ProGuard 等で最適化している場合は grpc-okhttp を最適化対象から外しておかないといけません。
0 件のコメント:
コメントを投稿