Spring Boot 3.x 最低要求 JDK 17,不支持 JDK 8、11、14、16 等更低版本,因其依赖 Spring Framework 6 和 Jakarta EE 9+,需 JDK 17 的字节码版本(61.0)及新特性支持。

看项目依赖框架的官方最低 JDK 要求
应用真正需要的最低 Java 版本,往往不由你自己写的代码决定,而是被所用框架“锁死”。比如 Spring Boot 3.0 明确要求 JDK 17,哪怕你只写了 System.out.println,跑在 JDK 11 上也会启动失败,报错类似:java.lang.UnsupportedClassVersionError: Unsupported major.minor version 61.0(61.0 对应 JDK 17 字节码)。
- 查清主框架文档:Spring Boot、Quarkus、Micronaut、Shiro、Struts2 等都有明确的 “System Requirements” 或 “Compatibility Matrix” 小节
- 注意版本边界:Spring Boot 2.7.x 最高兼容到
JDK 21(但部分补丁版对JDK 21支持不完整),而 Spring Boot 3.3.x 已开始实验性支持JDK 21和JDK 23,但生产仍推荐JDK 17 - 别只信 pom.xml 里的
maven.compiler.source:它只控制编译输出的字节码版本,不等于运行时能加载——比如设成11却用了java.time的新 API(JDK 17 新增),照样在JDK 11上抛NoSuchMethodError
检查是否用了已移除或封装的 JDK 内部 API
从 JDK 9 开始,Java 强化模块系统,大量内部类被封禁;JDK 11 更直接移除了 javax.* 包(如 javax.xml.bind)。如果你的应用或某 SDK 依赖这些,实际最低版本就被抬高了。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 典型移除项:
javax.annotation、javax.xml.bind、javax.activation—— 这些在 JDK 11+ 中必须显式引入第三方依赖(如jakarta.xml.bind:jakarta.xml.bind-api) - 典型封装项:
sun.misc.Unsafe(JDK 9+ 模块化后默认不可达)、jdk.internal.ref.Cleaner(JDK 14+ 替代旧版sun.misc.Cleaner) - 验证方式:启动时加 JVM 参数
-Xlog:module=debug(JDK 9+)或运行时报IllegalAccessError/NoClassDefFoundError,再结合jdeps --jdk-internals your-app.jar扫描内部 API 使用
确认 Maven/Gradle 构建与运行时 JDK 是否一致
很多问题不是“选错版本”,而是“用错地方”:Maven 编译用 JDK 17,但 java -jar 启动却调用了系统默认的 JDK 8。这种 mismatch 会导致编译通过、运行报错。
- 查构建环境:
mvn -version输出的Java version是 Maven 自身运行的 JDK,也是默认编译器来源 - 查运行环境:在应用启动脚本或容器
Dockerfile中显式指定JAVA_HOME,例如ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 - 本地 IDE(如 VSCode)需单独配置:
java.home设置必须指向目标 JDK 根目录(如/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home),否则语言服务器和调试器会用错版本
用 docker.io/openjdk 镜像时别被标签误导
openjdk:17 看似明确,实则模糊:它可能基于 Debian Bookworm、Alpine、Ubuntu,也可能用的是不同发行商(Eclipse Temurin、Amazon Corretto、Red Hat)的构建。同一标签在不同时间拉取,JDK 小版本甚至基础 OS 都可能变化。
- 生产务必锁定具体镜像:优先用
openjdk:17-jre-slim-bullseye(Temurin + Debian 11)或eclipse-temurin:17-jre-jammy(Ubuntu 22.04) - 进容器后第一件事是验证:
java -version和echo $JAVA_HOME,确保不是 fallback 到系统自带的旧版 - 注意时区、编码、
glibc兼容性:Alpine 镜像用musl,某些 JNI 库(如 Oracle JDBC)可能不兼容,此时不能只看 JDK 大版本
UnsupportedClassVersionError 或静默行为变更上。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










