楼层: 首页/ 软件技术/ Java 基础/ 最新版本与兼容性:选哪个 JDK,别被版本号绕晕
v

最新版本与兼容性:选哪个 JDK,别被版本号绕晕

JDK Releases · LTS · Vendors · Migration Notes

Oracle 从 2017 年(JDK 10 起)改成每 6 个月发一个新版本,但只有 LTS(Long-Term Support)版本才值得上生产。下面这张表把当前能用的版本一次摆清——学习用 21,新项目用 25,维护老项目才碰 8/11/17。

版本类型发布时间一句话定位
JDK 25 LTS最新 LTS2025.9目前最新 LTS,长期支持到约 2033。虚拟线程在 21 已正式(不再是预览);作用域值(Scoped Values,JDK 25 转正)、向量 API 等现代特性落地;结构化并发仍处预览。新项目首选。
JDK 21 LTS当前主力2023.9企业界当前装机量最大的 LTS,支持到 2031。虚拟线程(正式)、switch 模式匹配(正式)、序列集合。本页代码基线。
JDK 17 LTS上一代2021.9上一个 LTS,仍广泛使用。sealed 类正式、instanceof 模式匹配正式、文本块正式。大量老 Spring Boot 3.x 项目跑在 17。
JDK 11 LTS老 LTS2018.9曾经的主力,现在只剩维护。引入 var、HTTP Client、局部变量类型推断。Java EE 模块(javax.xml.bind 等)被移除。
JDK 8 LTS祖传代码2014.3历史最长寿的 LTS,至今仍有大量遗留系统。Lambda、Stream 从这开始。Oracle 对商用 8 的免费更新早已截止。
JDK 22 / 23 / 24非 LTS每半年非 LTS 版本只享受 6 个月支持,纯尝鲜用。生产环境一律不选。

各版本标志性新特性速查表

特性正式版价值
var 类型推断10局部变量不用写类型,编译器自己推。
文本块 """15多行字符串,写 SQL/JSON 不用拼。
record 记录类16一行定义不可变数据类。
instanceof 模式匹配16判类型同时强转好。
sealed 密封类17规定父类只允许哪些子类继承。
switch 箭头 + 多值14不写 break 不穿透。
虚拟线程 Virtual Threads21 正式(预览起于 19)轻量级线程,一个请求一个虚拟线程,写法和平台线程一样。
switch 模式匹配21 正式switch 里按类型、按 record 组件解构。
序列集合 Sequenced Collection21统一 getFirst()/getLast()/reversed() 接口。
结构化并发 Structured Concurrency25(预览)把多个子任务绑成一个工作单元,一起成功一起失败。
作用域值 Scoped Values25(正式)虚拟线程时代替代 ThreadLocal 的不可变传递方案。
向量 API Vector API25(孵化)用 SIMD 指令做数值计算,科学计算场景。

JDK vs JRE vs JVM:三胞胎的区别

名字包含什么给谁用
JVMJava 虚拟机,负责把字节码翻译成机器指令。只跑 .class 文件时存在。
JREJVM + 核心类库(rt.jar / modules)。只跑 Java 程序、不写代码的终端用户。JDK 11 起官方不再单独提供 JRE。
JDKJRE + javac 编译器 + jdb 调试器 + jcmd/jmap/jstack 等工具。开发者必装。本页所有代码都在 JDK 上写。

发行版对比:Oracle JDK / OpenJDK / Temurin / Zulu / Corretto / GraalVM

"OpenJDK" 是开源代码仓库,"Oracle JDK" 是 Oracle 基于 OpenJDK 打的二进制包。各家厂商(Adoptium、Amazon、Azul)都基于 OpenJDK 自己编译、自己打包、自己维护——这就是"Temurin、Corretto、Zulu"这些名字的来历。

发行版厂商特点什么时候选
Oracle JDKOracle功能最全,但商用要付费(按员工数订阅)。不差钱、或用 Oracle 商业支持合同。
OpenJDK社区开源源码,本身不直接发生产二进制。自己编译、或作为上游参考。
TemurinAdoptium(Eclipse 基金会)免费、可商用、社区最主流,IDEA 默认推荐。初学和个人项目首选。
ZuluAzul免费社区版 + 商业支持版,长寿支持拉得很长。需要超长支持周期(JDK 8 维护到 2030+)。
CorrettoAmazonAWS 上跑最舒服,Amazon 自家生产环境同款。项目部署在 AWS。
GraalVMOracle在 OpenJDK 之上加了即时编译(Native Image),能把 Java 程序编译成单个可执行文件,启动快、内存小。Serverless / 云原生 / 微服务启动优化。学习阶段不用碰。

从 JDK 8 一路升到 21:迁移要踩的三个坑

迁移点说明 & 怎么办
① javax → jakarta(EE 层面)Spring Boot 3.x / Tomcat 10+ 起,包名从 javax.servlet.* 改成 jakarta.servlet.*。这不是 JDK 本身的变化,而是 JavaEE 捐给 Eclipse 后的强制改名。JDK 升级到 17/21 时,如果你同时上 Spring Boot 3,就要整体换包名。SE 层面的 java.* / javax.lang 不受影响。
② 模块系统 JPMS(JDK 9+)JDK 9 引入模块化,但默认对 classpath 上的老代码向后兼容。除非你主动写 module-info.java,否则老 jar 照常跑。真要拆模块时再学,初学不用管。
③ 被移除的 APIJDK 11 移除了 java.xml.bind(JAXB)、java.activation、CORBA 等老 EE 模块。老代码用 JAXB 解析 XML 升到 11 会编译报错——自己引入 Maven 依赖(jaxb-api / jaxb-runtime)即可。

论给学习路线的建议

本地装:Temurin 21 LTS(免费、稳定、教程最多)。写本页代码够了。

新项目:直接上 21 或 25 LTS,虚拟线程是真红利。

老项目:别折腾。JDK 8 就老老实实待在 8,业务能跑比新特性值钱一百倍。