如何使用 Bazel 指定 Java 版本

How to specify Java version with Bazel

我正在使用 Bazel 构建和测试 Java 项目。它似乎正在使用从某处下载的 JDK10 进行编译。想指定它使用 JDK13。

我该怎么做?我可以把它放在 .bazelrc 或 BUILD 文件中吗?真的有麻烦了。

java_toolchain 似乎可以解决问题:

例如:

在您的 BUILD 文件中添加:

java_toolchain(
    name = "bootstrap_toolchain",
    # javac -extdirs is implemented by appending the contents to the platform
    # class path after -bootclasspath. For convenience, we currently have a
    # single jar that contains the contents of both the bootclasspath and
    # extdirs.
    bootclasspath = ["//tools/jdk:platformclasspath.jar"],
    extclasspath = [],
    genclass = ["bootstrap_genclass_deploy.jar"],
    ijar = ["//third_party/ijar"],
    javabuilder = ["bootstrap_VanillaJavaBuilder_deploy.jar"],
    javac = ["//third_party/java/jdk/langtools:javac_jar"],
    jvm_opts = [
        # Prevent "Could not reserve enough space for object heap" errors on Windows.
        "-Xmx512m",
        # Using tiered compilation improves performance of Javac when not using the worker mode.
        "-XX:+TieredCompilation",
        "-XX:TieredStopAtLevel=1",
    ],
    singlejar = ["//src/java_tools/singlejar:bootstrap_deploy.jar"],
    source_version = "8",
    tags = ["manual"],
    target_version = "8",
    visibility = ["//visibility:public"],
)

.bazelrc

build --java_toolchain=//:bootstrap_toolchain

Bazel 附带了一些已经定义的工具链,它们可以在命令行或 .bazlrc 中指定:

build --java_toolchain=@bazel_tools//tools/jdk:toolchain_java11 --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_java11

遗憾的是还没有标准的 JDK13 工具链..

您现在可以Configure the JDK Toolchain使用本地安装的JDK。

安装 OpenJDK16 后,我创建了 ~/.bazelrc,内容如下:

build --define=ABSOLUTE_JAVABASE=/home/guaporocco/.jdks/openjdk-16
build --javabase=@bazel_tools//tools/jdk:absolute_javabase
build --host_javabase=@bazel_tools//tools/jdk:absolute_javabase
build --java_toolchain=@bazel_tools//tools/jdk:toolchain_vanilla
build --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_vanilla

我可以确认这适用于使用版本 11 之后引入的功能的测试项目,例如多行字符串。