关于Bazel Coverage无法复用bazel info java-home指定JDK及配置优化的疑问
bazel info java-home指定JDK及配置优化的疑问 我完全理解你的困惑——明明Bazel自己已经有可用的JDK(就是bazel info java-home返回的那个),为什么跑coverage的时候还要额外指定另一个JDK?还要手动装新的,确实有点折腾人。咱们来一步步解决这个问题:
为什么默认不能直接复用?
Bazel在执行coverage分析时,对JDK的依赖逻辑和常规构建不太一样:它需要明确识别一个符合要求的JDK工具链,而bazel info java-home返回的只是Bazel自身运行时依赖的JDK路径,这个路径并没有自动注册到Bazel的构建体系里,让coverage规则能直接调用到,所以才需要手动通过local_java_repository来完成注册。
怎么直接复用bazel info java-home的JDK?
当然可以!你不需要硬编码固定的JDK路径,有两种更灵活的方式:
方式一:通过命令行动态传递路径
先把WORKSPACE里的local_java_repository改成支持环境变量的形式:
load("@bazel_tools//tools/jdk:local_java_repository.bzl", "local_java_repository") local_java_repository( name = "additionaljdk", version = "11", java_home = "$(JAVA_HOME)", )
然后运行coverage的时候,直接把bazel info java-home的结果作为环境变量传进去:
bazel coverage --repo_env=JAVA_HOME=$(bazel info java-home) //your:target
这样就动态把Bazel自带的JDK路径绑定到了你定义的规则里,完全不用硬编码。
方式二:直接复用Bazel默认的local_jdk仓库
其实还有更省心的办法——Bazel默认已经把自身使用的JDK注册成了名为local_jdk的仓库,你只需要让coverage规则用它就行。可以在项目根目录的.bazelrc文件里添加这段配置:
build:coverage --java_runtime_version=local_jdk
之后跑coverage的时候,只要加上--config=coverage参数就行:
bazel coverage --config=coverage //your:target
这种方式连WORKSPACE里的local_java_repository都不用加,直接复用Bazel自带的JDK,完美符合你不想额外安装JDK的需求。
补充说明
之前你手动指定固定路径能运行,是因为手动注册了一个符合要求的JDK工具链,但其实完全没必要这么做——利用Bazel自带的local_jdk或者动态传递路径,就能避免额外安装的麻烦。
备注:内容来源于stack exchange,提问作者KarimH

