如何使用 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 之后引入的功能的测试项目,例如多行字符串。
我正在使用 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 之后引入的功能的测试项目,例如多行字符串。