如何在Bazel中配置远程JDK7作为编译/执行工具链?
问题场景
需要在Bazel中使用JDK 7,并将java_binary输出作为编译工具。已在WORKSPACE中配置远程JDK,BUILD文件中定义了工具链,但执行构建命令时工具链被拒绝,报错如下:
Type @bazel_tools//tools/jdk:runtime_toolchain_type: target platform @local_config_platform//:host: Rejected toolchain @remotejdk//:jdk; mismatching config settings: prefix_version_setting
构建自动回退到openjdk11_linux,通过查询得知prefix_version_setting的值为remotejdk_7。
原WORKSPACE配置:
load("@bazel_tools//tools/jdk:remote_java_repository.bzl", "remote_java_repository") remote_java_repository( name = "remotejdk", prefix = "remotejdk", version = "7", exec_compatible_with = [ "@platforms//os:linux", "@platforms//cpu:x86_64" ], urls=["https://download.java.net/openjdk/jdk7u75/ri/openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz"], sha256 = "56d84d0bfc8c1194d501c889765a387e949d6a063feef6608e5e12b8152411fb")
原BUILD中的工具链定义:
load( "@bazel_tools//tools/jdk:default_java_toolchain.bzl", "default_java_toolchain", "VANILLA_TOOLCHAIN_CONFIGURATION" ) default_java_toolchain( name = "repository_default_toolchain", configuration = VANILLA_TOOLCHAIN_CONFIGURATION, java_runtime = "@remotejdk//:jdk", jvm_opts = [], source_version = "7", )
问题原因
--java_runtime_version参数的值需要与remote_java_repository中prefix和version的组合完全匹配。本例中prefix=remotejdk+version=7生成的版本标识是remotejdk_7,但命令行中使用了7,导致版本设置不匹配,工具链被拒绝。
修正方案
1. 修正构建命令
将--java_runtime_version=7替换为remotejdk_7,这是远程JDK生成的正确版本标识。执行以下命令:
bazel build //:CreateFile --java_language_version=7 --java_runtime_version=remotejdk_7
若需手动指定工具链(Bazel通常会自动匹配),可使用远程JDK自动生成的工具链目标:
bazel build //:CreateFile --java_language_version=7 --java_runtime_version=remotejdk_7 --extra_toolchains=@remotejdk//:toolchain
2. (可选)修复自定义工具链定义
如果需要保留自定义工具链,需添加版本设置关联和兼容约束,确保与远程JDK配置一致:
default_java_toolchain( name = "repository_default_toolchain", configuration = VANILLA_TOOLCHAIN_CONFIGURATION, java_runtime = "@remotejdk//:jdk", jvm_opts = [], source_version = "7", version_setting = "@bazel_tools//tools/jdk:prefix_version_setting", toolchain_type = "@bazel_tools//tools/jdk:runtime_toolchain_type", exec_compatible_with = [ "@platforms//os:linux", "@platforms//cpu:x86_64" ] )
此时使用自定义工具链的构建命令为:
bazel build //:CreateFile --java_language_version=7 --java_runtime_version=remotejdk_7 --extra_toolchains=//:repository_default_toolchain
3. 验证配置
执行以下命令查看工具链解析过程,确认是否成功选中JDK 7:
bazel build //:CreateFile --java_language_version=7 --java_runtime_version=remotejdk_7 --toolchain_resolution_debug=@bazel_tools//tools/jdk:runtime_toolchain_type
若输出中显示Selected toolchain @remotejdk//:jdk,说明配置生效。
内容的提问来源于stack exchange,提问作者Johnny Vm

