应选用 adoptium(eclipse temurin)的 openjdk 21:免费开源、lts 支持至 2026 年 9 月、无捆绑软件;安装时选自定义路径(避免中文/空格)、环境变量仅设 java_home 并将 %java_home%in 置于 path 顶部,删除其他 java 路径;ide 和 spring boot 需手动配置 jdk 21,注意反射限制问题。

怎么选对下载源,避开登录墙和捆绑软件
Oracle 官网现在强制登录才能下载 JDK 21,且安装包自带“推荐软件”勾选项(比如 McAfee、JavaFX 文档等),一不小心就装上不需要的东西。更关键的是,Oracle JDK 21 的免费商用许可仅限个人开发和测试,企业部署需订阅——这点常被忽略。
推荐直接用 Adoptium(Eclipse Temurin)的 OpenJDK 21 构建版:完全免费、开源、LTS 支持到 2026 年 9 月,且安装包干净无捆绑。
- 打开
https://adoptium.net/→ 点击 “Latest releases” → 选择版本21→ 平台选Windows x64→ 下载Installer (.exe) - 安装时注意取消勾选 “Install Eclipse Temurin Updater”(非必需)和任何第三方工具栏
- 别点“立即安装”,先点“自定义安装”确认目标路径不含中文、空格或特殊符号(例如
D:Javajdk-21.0.5安全,C:Program FilesJavajdk-21也行,但C:我的Javajdk21会出问题)
环境变量只改 JAVA_HOME 就够了吗
够,但必须确保 Path 中引用它的那一行在最前面。Windows 会按 Path 顺序查找 java.exe,如果旧版本(比如 Java 17)的 %JAVA_HOME_17%in 或 C:Program FilesJavajdk-17in 排在前面,java -version 仍会显示 17。
- 新建系统变量:
JAVA_HOME=D:Javajdk-21.0.5(填你实际安装路径) - 编辑
Path→ 点“新建” → 输入%JAVA_HOME%in - 把这行拖到
Path列表顶部(或至少确保它在所有其他 Java 相关路径之前) - 删掉
Path中所有硬编码的 Java 路径(如C:Program FilesJavajdk-17in),避免冲突
where java 显示多个路径,说明什么
说明你的 Path 里有不止一个 Java bin 目录,系统会按顺序执行第一个匹配项。这不是错误,但容易误判当前生效版本。
运行 where java 后如果看到两行甚至三行输出(比如 C:Program FilesJavajdk-17injava.exe 和 D:Javajdk-21.0.5injava.exe),就证明旧路径没清理干净或新路径没置顶。
- 打开命令提示符,依次执行:
echo %JAVA_HOME%(确认指向 21)、where java(看优先级)、java -version(最终结果) - 如果
where java多于一行,回到环境变量,删掉Path中所有非%JAVA_HOME%in的 Java 路径 - 改完务必重启终端(关掉再开 cmd 或 PowerShell),环境变量不会热更新
IDEA / VS Code / Spring Boot 3.2.x 能直接用吗
能,但得手动告诉它们用哪个 JDK。IntelliJ IDEA 不会自动切换项目 SDK,它只认你上次配置的版本;VS Code 的 Java 扩展默认用系统 JAVA_HOME,但项目 java.version 配置可能锁死为 17;Spring Boot 3.2.x 要求最低 JDK 17,但官方推荐 JDK 21,且启用虚拟线程(Thread.ofVirtual())等功能必须用 21+。
- IDEA:File → Project Structure → Project → Project SDK → 点“New…” → “JDK” → 选
D:Javajdk-21.0.5 - VS Code:打开
.vscode/settings.json,加一行:"java.configuration.runtimes": [{"name": "JavaSE-21","path": "D:\Java\jdk-21.0.5"}] - Spring Boot:检查
pom.xml中maven-compiler-plugin的source和target是否设为21,否则编译会降级兼容
真正容易被忽略的是:JDK 21 默认启用 --illegal-access=deny,老项目若反射调用内部 API(比如 sun.misc.Unsafe),会直接抛 NoClassDefFoundError 或 IllegalAccessException,这时得加 JVM 参数临时绕过,而不是以为环境没配好。










