Bazel中GRPC循环依赖及类找不到错误求助
Bazel处理GRPC循环依赖与类缺失问题的解决方案
问题背景
- 先触发类缺失错误:
Caused by: java.lang.ClassNotFoundException: io.grpc.internal.ServerImplBuilder at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527) ... 3 more
- 添加
grpc-core:1.60.0依赖后出现Bazel循环依赖错误:
@@grpc//:io_grpc_grpc_all (e78a2bcb...) @@grpc//:io_grpc_grpc_xds (e78a2bcb...) @@grpc//:io_grpc_grpc_services (e78a2bcb...) .-> @@grpc//:io_grpc_grpc_util (e78a2bcb...) | @@grpc//:io_grpc_grpc_core (e78a2bcb...) `-- @@grpc//:io_grpc_grpc_util (e78a2bcb...)
- 已尝试但无效的操作:
- 调整GRPC版本,同一版本仍出现循环依赖
- 将GRPC单独配置在
maven_install仓库中 - 排除
grpc-core的grpc-util依赖 - 使用
override规则强制固定版本
解决方案
1. 放弃grpc-all,按需引入单个GRPC模块
grpc-all会引入所有GRPC子模块,极易触发依赖冲突和循环。直接引入业务实际需要的模块,示例配置:
maven_install( name = "grpc", artifacts = [ "io.grpc:grpc-core:1.60.0", "io.grpc:grpc-netty-shaded:1.60.0", "io.grpc:grpc-protobuf:1.60.0", "io.grpc:grpc-stub:1.60.0", # 按需添加其他模块,比如grpc-services(若用到) ], fetch_sources = True, repositories = [ "https://repo1.maven.org/maven2", ], )
2. 用conflict_resolution统一GRPC版本
借助rules_jvm_external的冲突处理机制,在maven_install中强制所有GRPC模块使用同一版本,避免循环:
maven_install( name = "grpc", artifacts = [ # 你的业务依赖列表 ], conflict_resolution = "highest", # 自动选择最高版本,或指定固定版本 overrides = [ maven.override( group = "io.grpc", artifact = "*", version = "1.60.0", ), ], fetch_sources = True, repositories = [ "https://repo1.maven.org/maven2", ], )
3. 排查第三方依赖的GRPC引入
用bazel query命令找出所有引入GRPC的依赖,确认是否有第三方库引入了不同版本:
bazel query "deps(//your/target) | filter io.grpc"
若发现第三方依赖引入旧版GRPC,在对应依赖中排除所有GRPC模块:
maven.artifact( group = "com.example", artifact = "third-party-lib", version = "1.0.0", exclusions = [ "io.grpc:*", ], )
4. 清理Bazel缓存
缓存异常可能导致依赖解析错误,清理后重新构建:
bazel clean --expunge
内容的提问来源于stack exchange,提问作者gph
相关产品推荐
相关产品推荐

