如何通过Bazel Query获取SDK的传递性外部依赖以生成正确POM?
我使用java_export规则发布SDK,配置如下:
load("@rules_jvm_external//:defs.bzl", "java_export") java_export( name = "sdk_maven", maven_coordinates = "sdk:1.0.0", pom_template = "pom_template_1.xml", visibility = ["//visibility:public"], runtime_deps = [ ":module", ], tags = ["no-javadocs"], )
执行构建Maven发布文件的命令:
bazel build //clients/sdk:sdk_maven.publish
生成的JAR包含所有传递类文件,但pom.xml中不包含当前模块依赖的其他模块所使用的外部依赖。
尝试过以下命令获取依赖:
bazel query "filter('@maven', deps(//clients/sdk:sdk_maven.publish))" | sed 's#^# "#;s#$#",#'
但返回的是类似@maven_redisson//:com_fasterxml_jackson_dataformat_jackson_dataformat_yaml的内部目标,而非@maven_redisson这类带版本的顶层依赖。将这些内部目标添加到java_export的deps中时,触发可见性错误:
ERROR: /Users/abhisheksingh/Documents/clients/sdk/BUILD.bazel:365:12: in java_library rule //clients/sdk:sdk_maven-lib: target '@maven_redisson//:com_fasterxml_jackson_dataformat_jackson_dataformat_yaml' is not visible from target '//clients/sdk:sdk_maven-lib'. Check the visibility declaration of the former target if you think the dependency is legitimate
解决方案:获取顶层Maven依赖的Bazel Query命令
要直接获取你在maven_install中声明的顶层带版本依赖(而非内部子目标),可以使用以下命令:
bazel query "kind(maven_install, deps(//clients/sdk:sdk_maven.publish))" | sed 's#^# "#;s#$#",#'
如果需要过滤特定仓库前缀的依赖(比如仅保留@maven_开头的目标),可以调整为:
bazel query "filter('@maven_', kind(maven_install, deps(//clients/sdk:sdk_maven.publish)))" | sed 's#^# "#;s#$#",#'
关键说明:
为什么之前的命令失效?
之前的filter('@maven')会匹配所有含@maven的目标,包括maven_install自动生成的内部子JAR目标,这些子目标默认没有对外可见性,因此添加到deps会触发错误。而kind(maven_install)仅匹配顶层的依赖声明目标,这类目标默认具备对外可见性。应用结果到java_export
将命令输出的依赖列表添加到java_export的deps或runtime_deps中(根据依赖类型选择),重新执行构建后,生成的pom.xml就会包含正确的顶层Maven依赖坐标。适配其他依赖管理规则
若你的外部依赖不是通过maven_install管理,而是jvm_import等其他规则,只需将kind(maven_install)替换为对应的规则类型即可,比如kind(jvm_import)。
内容的提问来源于stack exchange,提问作者Abhishek Singh

