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

如何在Bazel中实现类似Maven exclusions的传递依赖排除?

在Bazel中排除传递依赖的实现方式

Bazel里没有和Maven exclusions完全一致的直接语法,但可以通过以下几种方式实现类似效果:

1. 在maven_install中配置全局/局部排除(最接近Maven exclusions)

如果你用rules_jvm_external的maven_install管理Maven依赖,可以直接在配置里指定exclusions来剔除传递依赖,格式为[依赖坐标]:[要排除的坐标],支持通配符*:

maven_install(
    artifacts = [
        "com.example:foo:1.0.0",
    ],
    exclusions = [
        # 排除foo依赖的com.example:bar
        "com.example:foo:com.example:bar",
        # 排除所有依赖中的org.unwanted:bad-lib
        "*:org.unwanted:bad-lib",
    ],
    repositories = [
        "https://repo1.maven.org/maven2",
    ],
)

2. 用neverlink排除链接阶段的依赖

如果只是不想让某个传递依赖被打包到最终二进制文件,但编译时仍需要它,可以给目标规则加上neverlink参数:

java_library(
    name = "my-lib",
    srcs = glob(["*.java"]),
    deps = [
        "@maven//:com_example_foo",
        "@maven//:com_unwanted_bad_lib",
    ],
    # 标记该依赖仅用于编译,不参与链接和打包
    neverlink = ["@maven//:com_unwanted_bad_lib"],
)

这样这个依赖不会传递给依赖my-lib的其他目标,也不会出现在最终的可执行文件或JAR包中。

3. 手动导入依赖并控制传递性

如果是单个JAR文件,可以用jvm_import手动导入,完全自定义依赖列表,不继承原有的传递依赖:

jvm_import(
    name = "custom-jar",
    jars = ["path/to/your.jar"],
    # 只添加你需要的依赖,原JAR的传递依赖不会被引入
    deps = [
        "@maven//:com_google_guava_guava",
    ],
)

4. 筛选依赖target

部分Maven依赖在Bazel中会被拆分为多个子target,你可以只引用需要的子target,避免引入不必要的传递依赖。比如某些库会拆分出-core、-extensions等模块,只依赖核心模块即可。

内容的提问来源于stack exchange,提问作者Jianwu Chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:17:14