如何在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
相关产品推荐
相关产品推荐

