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 | 最新 LTS | 2025.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 | 老 LTS | 2018.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 Threads | 21 正式(预览起于 19) | 轻量级线程,一个请求一个虚拟线程,写法和平台线程一样。 |
| switch 模式匹配 | 21 正式 | switch 里按类型、按 record 组件解构。 |
| 序列集合 Sequenced Collection | 21 | 统一 getFirst()/getLast()/reversed() 接口。 |
| 结构化并发 Structured Concurrency | 25(预览) | 把多个子任务绑成一个工作单元,一起成功一起失败。 |
| 作用域值 Scoped Values | 25(正式) | 虚拟线程时代替代 ThreadLocal 的不可变传递方案。 |
| 向量 API Vector API | 25(孵化) | 用 SIMD 指令做数值计算,科学计算场景。 |
JDK vs JRE vs JVM:三胞胎的区别
| 名字 | 包含什么 | 给谁用 |
|---|---|---|
| JVM | Java 虚拟机,负责把字节码翻译成机器指令。 | 只跑 .class 文件时存在。 |
| JRE | JVM + 核心类库(rt.jar / modules)。 | 只跑 Java 程序、不写代码的终端用户。JDK 11 起官方不再单独提供 JRE。 |
| JDK | JRE + 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 JDK | Oracle | 功能最全,但商用要付费(按员工数订阅)。 | 不差钱、或用 Oracle 商业支持合同。 |
| OpenJDK | 社区 | 开源源码,本身不直接发生产二进制。 | 自己编译、或作为上游参考。 |
| Temurin | Adoptium(Eclipse 基金会) | 免费、可商用、社区最主流,IDEA 默认推荐。 | 初学和个人项目首选。 |
| Zulu | Azul | 免费社区版 + 商业支持版,长寿支持拉得很长。 | 需要超长支持周期(JDK 8 维护到 2030+)。 |
| Corretto | Amazon | AWS 上跑最舒服,Amazon 自家生产环境同款。 | 项目部署在 AWS。 |
| GraalVM | Oracle | 在 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 照常跑。真要拆模块时再学,初学不用管。 |
| ③ 被移除的 API | JDK 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,业务能跑比新特性值钱一百倍。