错误提示:
Exception in thread "main" java.util.ServiceConfigurationError: io.grpc.NameResolverProvider: Provider io.grpc.grpclb.SecretGrpclbNameResolverProvider$Provider could not be instantiated
java.lang.VerifyError: Cannot inherit from final class
错误原因
调用组件间版本不匹配导致
引用版本
grpc-core: 1.27.1 grpc-grpclb: 1.33.0
出现错误:
错误原因
grpclb的依赖显示对grpc-core、grpc-protobuf、grpc-stub有比较强的依赖关系. grpc如版本间有大的变更, 则版本不匹配会导致grpclb所使用到的API、Class、Interface等出现删除、变更等情况.而造成调用失败.
1.27.1版本:
grpc-core中
DnsNameResolver为final类
. grpc-grpclb中SecretGrpclbNameResolverProvider$Provider
继承的BaseDnsNameResolverProvider.newNameResolver方法
返回的NameResolver为DnsNameResolver. 所以两个包都是1.27.1时是可以正常调用的,不会发生final类不能继承的错误.
升级grpc-grpclb版本为1.30+
SecretGrpclbNameResolverProvider$Provider
直接继承NameResolverProvider,其newNameResolver方法
返回GrpclbNameResolver(继承自DnsNameResolver)
,此时还用grpc-core 1.27.1版本时. DnsNameResolver是final类, 无法被继承. 导致类加载出错. 而grpc-core 1.30+已经将DnsNameResolver声明为public类,调用正常.
解决方法:
保持io.grpc各个组件版本一致或者差异不要非常大(grpc版本迭代间经常有去除某些组件或者常、变量的情况.), 出现类找不到、变量找不到的情况就看看是否是版本不匹配造成的. 类似情况也尝试看下版本不匹配的问题