Grpc版本冲突导致SecretGrpclbNameResolverProvider$Provider could not be instantiated

错误提示:

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

出现错误:

Grpc版本冲突导致SecretGrpclbNameResolverProvider$Provider could not be instantiated_第1张图片

错误原因

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版本冲突导致SecretGrpclbNameResolverProvider$Provider could not be instantiated_第2张图片
Grpc版本冲突导致SecretGrpclbNameResolverProvider$Provider could not be instantiated_第3张图片
Grpc版本冲突导致SecretGrpclbNameResolverProvider$Provider could not be instantiated_第4张图片

升级grpc-grpclb版本为1.30+

SecretGrpclbNameResolverProvider$Provider直接继承NameResolverProvider,其newNameResolver方法返回GrpclbNameResolver(继承自DnsNameResolver),此时还用grpc-core 1.27.1版本时. DnsNameResolver是final类, 无法被继承. 导致类加载出错. 而grpc-core 1.30+已经将DnsNameResolver声明为public类,调用正常.

Grpc版本冲突导致SecretGrpclbNameResolverProvider$Provider could not be instantiated_第5张图片
Grpc版本冲突导致SecretGrpclbNameResolverProvider$Provider could not be instantiated_第6张图片
Grpc版本冲突导致SecretGrpclbNameResolverProvider$Provider could not be instantiated_第7张图片

解决方法:

保持io.grpc各个组件版本一致或者差异不要非常大(grpc版本迭代间经常有去除某些组件或者常、变量的情况.), 出现类找不到、变量找不到的情况就看看是否是版本不匹配造成的. 类似情况也尝试看下版本不匹配的问题

你可能感兴趣的:(java,java,grpc)