Spring Boot项目实际依赖的Spring Framework版本由spring-boot-starter-parent版本决定,需通过官方文档查对应关系,再确认其JDK要求;仅看pom.xml中java.version不足够,因编译配置不保证运行时兼容性。

怎么看 Spring Boot 项目实际依赖的 Spring Framework 版本
Spring Boot 的 spring-boot-starter-parent 版本决定了它内嵌的 Spring Framework 版本,而后者又硬性绑定 JDK 最低版本。不能只看 spring-boot-starter-parent 的数字,得顺藤摸瓜查到底层框架要求。
- 打开项目的
pom.xml,找到<parent>块里的spring-boot-starter-parent版本,比如3.3.5 - 去 Spring Boot 官方版本说明页 查该版本对应的 Spring Framework 版本(例如 3.3.5 → Spring Framework 6.1.12)
- 再查 Spring Framework 官方文档或其
spring-frameworkGitHub Release 页面,确认该 Framework 版本的java.version要求(6.1.x 系列要求 JDK 17+,6.2.x 开始推荐 JDK 21,7.0.x 要求 JDK 25)
为什么不能只信 pom.xml 里的 <java.version>
<java.version> 只控制 Maven 编译插件的 source 和 target,它不保证运行时兼容性。Spring Framework 底层可能调用了 JDK 新增的 API、模块系统(JPMS)边界或字节码特性,这些在旧 JDK 上会直接抛 NoClassDefFoundError 或 UnsupportedClassVersionError。
- 常见误配:pom.xml 写了
<java.version>21</java.version>,但本地java -version是 17 —— 编译能过,启动报错 - 更隐蔽的情况:IDEA 的 Project SDK 设为 JDK 21,但 Maven Runner 的 JRE 设置仍为 JDK 17,导致构建和运行环境不一致
- Spring Boot 3.5.x 已基于 Spring Framework 7,强制要求 JDK 25;此时哪怕
<java.version>写成 21,也会在类加载阶段失败
jdeps 能帮你发现哪些 Spring 相关的 JDK 兼容问题
jdeps 不分析 Spring 的逻辑,但它能暴露你的代码或所用 Starter 里是否偷偷引用了 JDK 内部 API(比如 sun.misc.Unsafe),而这些在 JDK 17+ 默认被封禁,Spring 某些老版本的反射调用会因此崩掉。
- 运行命令:
jdeps --jdk-internals target/your-app.jar | grep -i spring - 重点看输出中是否含
not found、restricted或指向jdk.internal.*的路径 - 如果看到
spring-core-6.1.12.jar -> jdk.unsupported这类行,说明你用的 Spring Framework 版本尚未适配当前 JDK 的封装策略,得升级 Spring Boot 大版本 - 注意:Spring Boot 3.4+ 的 Starter 已默认规避大部分内部 API 调用,但自定义的 AOP 或序列化逻辑仍可能踩坑
OpenJDK 发行版之间对 Spring 的影响其实很小
只要版本号一致(如都是 JDK 21),Eclipse Temurin、Amazon Corretto、Azul Zulu 对 Spring Boot 行为基本无差异。真正影响迁移的是 JDK 主版本号与 Spring Framework 的基线匹配,不是发行商。
- 唯一需留意的例外:某些 OpenJDK 发行版默认关闭了
--enable-preview功能(如虚拟线程),而 Spring Boot 3.4+ 的@EnableAsync+ 虚拟线程模式需要显式启用 - 验证方式:启动时加
-XX:+UnlockExperimentalVMOptions -XX:+EnableVirtualThreadScheduling(JDK 21)或--enable-preview(JDK 25),再观察ThreadPoolTaskExecutor是否被自动替换 - 别花时间比对不同 OpenJDK 的 GC 行为差异——Spring Boot 的
spring-boot-starter-actuator+ Micrometer 已能统一采集各厂商的 JVM 指标


















