You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bazel中GRPC循环依赖及类找不到错误求助

Bazel处理GRPC循环依赖与类缺失问题的解决方案

问题背景

  1. 先触发类缺失错误:
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
  1. 添加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...)
  1. 已尝试但无效的操作:
    • 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:59:52