运行Bazel Java目标时出现java.lang.UnsupportedClassVersionError的原因
问题描述
执行Bazel命令指定用JDK15编译并运行官方Java示例项目:
bazel run --java_language_version="15" //:ProjectRunner
观察到Bazel已下载Zulu JDK15完成编译,但运行时抛出版本不兼容错误:
java.lang.UnsupportedClassVersionError: com/example/ProjectRunner has been compiled by a more recent version of the Java Runtime (class file version 59.0), this version of the Java Runtime only recognizes class file versions up to 55.0
已确认代码是用JDK15(类文件版本59.0)编译,但运行环境是JDK11(最高支持55.0),疑惑为何Bazel运行时未沿用编译用的JDK15。
核心原因
--java_language_version参数仅控制编译阶段的行为:指定Java语言版本标准,并调用对应版本的JDK完成编译。但Bazel的运行阶段默认会使用系统默认JDK,或Bazel自身配置的运行时JDK,不会自动关联编译用的JDK版本。
解决方案
1. 运行时显式指定JDK版本
在命令中添加--java_runtime_version参数,指定与编译版本匹配的JDK:
bazel run --java_language_version="15" --java_runtime_version="zulu_15" //:ProjectRunner
- 若使用本地自定义JDK路径,可替换为具体路径:
bazel run --java_language_version="15" --java_runtime_version="/usr/lib/jvm/zulu-15" //:ProjectRunner
2. 项目级全局配置
在项目根目录创建.bazelrc文件,添加以下配置,后续无需每次命令手动指定参数:
# 编译阶段默认用JDK15 build --java_language_version=15 # 运行阶段默认用JDK15 run --java_runtime_version=zulu_15
之后直接执行bazel run //:ProjectRunner即可自动使用JDK15编译和运行。
3. 检查并修改Bazel全局默认配置
执行以下命令查看Bazel当前默认使用的运行时JDK:
bazel info java-runtime
若需要全局修改(所有项目生效),可编辑用户级配置文件~/.bazelrc或系统级配置/etc/bazel.bazelrc,添加运行时JDK指定:
run --java_runtime_version=zulu_15
内容的提问来源于stack exchange,提问作者rumbleD5

