升级Google Cloud PubSub后,maven-assembly-plugin打包Jar遇pick_first策略缺失错误
问题原因分析
这个问题的核心是maven-assembly-plugin打包时合并META-INF/services文件的方式导致gRPC负载均衡策略提供者丢失,具体细节如下:
gRPC的服务注册机制
Google Cloud PubSub升级到1.123.13版本后,依赖的gRPC版本也同步更新。gRPC的负载均衡策略(如pick_first)是通过META-INF/services/io.grpc.LoadBalancerProvider文件进行注册的,每个提供负载均衡策略的依赖(比如grpc-core、grpc-alts等)都会包含这个文件,里面记录了对应的策略实现类。maven-assembly-plugin的打包缺陷
maven-assembly-plugin构建fat jar时,默认会对所有依赖中的同名文件进行覆盖式合并,而非内容追加合并。这就导致最终生成的jar包中,META-INF/services/io.grpc.LoadBalancerProvider文件只会保留最后一个被处理的依赖中的内容,其他依赖里注册的pick_first策略对应的Provider类被丢失,运行时自然找不到该策略。exec-maven-plugin正常运行的原因
exec-maven-plugin是直接使用项目编译后的类文件和所有依赖jar的原始类路径,不会合并META-INF/services下的文件,每个依赖的服务注册文件都能被gRPC的服务加载器正常读取,因此可以找到pick_first策略。
内容的提问来源于stack exchange,提问作者Nuwan Sameera
相关产品推荐
相关产品推荐

