本文首发于 CSDN,转载请注明出处。
先说结论:装 JDK 的第一步不是下载,是先确定装哪个版本,而这件事的答案在 2026 年已经变了。JDK 8 和 JDK 11 的免费更新都已经结束,当前 LTS 是 2025 年 9 月发布的 JDK 25;2026 年 9 月 15 日刚发布的 JDK 27 不是 LTS,只支持到 2027 年 3 月。至于环境变量,只有两件事要做:设JAVA_HOME,把它的 bin 目录加进PATH。网上那些让你同时配CLASSPATH的教程可以直接跳过。
该装哪个版本?先看这张表
Java 现在是半年发一版的节奏,每两版挑一版做长期支持版(LTS),其余版本的更新只维持到下一个版本发布后不久。所以数字最大的不等于最适合你:
| 版本 | 类型 | 状态 | 适合谁 |
|---|---|---|---|
| JDK 8 | 旧 LTS | 免费更新已于 2025 年 7 月结束 | 只在维护历史老项目时用 |
| JDK 11 | 旧 LTS | 同上 | 同上 |
| JDK 17 | LTS | 仍在支持期 | 依赖还没适配新版本时的稳妥选择 |
| JDK 21 | LTS | 仍在支持期 | 想用较新特性又要长期支持 |
| JDK 25 | 当前 LTS | 2025 年 9 月发布 | 新项目的默认选择 |
| JDK 27 | 特性版 | 2026 年 9 月 15 日发布,支持至 2027 年 3 月 | 学习、尝鲜新特性 |
如果你是为了跑别人的项目,不要自己拍板。先去看项目里的构建配置:Maven 项目看pom.xml里的maven.compiler.source,Gradle 项目看sourceCompatibility,Spring Boot 项目还要看它要求的最低 Java 版本。装错版本最典型的表现是编译时抛invalid target release,或者运行时报Unsupported class file major version。
关于 JDK 27 顺便说清楚:它带来的一些改进是零代码改动就能生效的,比如紧凑对象头默认启用(对象头从 96 位压到 64 位)、G1 成为所有环境下的默认垃圾收集器。但非 LTS 版本不适合拿来做长期运行的线上环境,这条比新特性重要。
Windows 上怎么装?
优先用安装包,不要用 zip 绿色包。安装包会顺手把 JDK 注册到系统里,IDE 和构建工具能自动发现它;zip 包免安装,但路径全靠自己配,出问题的概率大得多。
安装过程只有一处需要注意:路径不要包含中文和空格。默认的C:\Program Files\Java\jdk-xx就是合适的,没必要改。
装完配两个环境变量,入口是「此电脑 → 属性 → 高级系统设置 → 环境变量」:
| 变量 | 位置 | 值 |
|---|---|---|
| JAVA_HOME | 系统变量,新建 | JDK 安装根目录,例如C:\Program Files\Java\jdk-25 |
| Path | 系统变量,编辑 | 新增一行%JAVA_HOME%\bin |
JAVA_HOME最容易错的地方是多带了一段\bin。很多工具拿到这个变量后会自己再拼一次bin,多一层就找不到可执行文件了。
还有一条要纠正:「必须配 CLASSPATH」是过时做法。那是早期 JDK 的需求,现代 JDK 和构建工具都自己管类路径。配错了反而可能干扰类加载,所以不需要配。
macOS 和 Linux 怎么配?
macOS 用安装包时,JDK 会落在系统目录,真实路径形如/Library/Java/JavaVirtualMachines/jdk-25.jdk/Contents/Home。终端现在默认 zsh,要改的是~/.zshrc:
exportJAVA_HOME=$(/usr/libexec/java_home-v25)exportPATH="$JAVA_HOME/bin:$PATH"这里特意用系统自带的查询命令,而不是把那条很长的路径写死——以后换版本只改一个版本号,不用再去翻目录名。改完执行source ~/.zshrc生效。
Linux 上是两条路。图省事就用包管理器:
# Debian / Ubuntusudoaptinstallopenjdk-25-jdk# RHEL / Fedora / CentOS Streamsudodnfinstalljava-25-openjdk-devel如果要用官方压缩包,解压到/usr/lib/jvm/下,再用update-alternatives注册,这样多版本切换才受系统统一管理:
sudotar-xvzfopenjdk-25_linux-x64_bin.tar.gz-C/usr/lib/jvm/sudoupdate-alternatives--install/usr/bin/javajava/usr/lib/jvm/jdk-25/bin/java1sudoupdate-alternatives--configjava最后一条就是之后切换版本要用的命令,记这一条比记路径有用。
怎么验证真的装好了?
两条命令都要过,缺一不可:
java-versionjavac-version只测java是不完整的。java是运行环境,javac是编译器。有些机器上前者能跑、后者提示「不是内部或外部命令」,原因就是PATH指到了 JRE 目录而不是 JDK,或者压根没配PATH。
装过多个版本的话,还要确认当前生效的是哪一个:
# Windows:列出所有命中项,按 PATH 顺序wherejava# macOS / Linux:-a 会列出全部which-ajava装了多个版本怎么切换?
这是实际开发里最普遍的需求:老项目要 8 或 11,新项目要 17 以上。两个原则要记住。
第一,JAVA_HOME决定构建工具用哪个版本,PATH决定命令行用哪个版本,两者必须指向同一个。不然会出现「命令行显示 25、Maven 却按 17 编译」这种很难查的错乱。
第二,把切换固定成一条命令,而不是每次手动改环境变量。macOS 上只改JAVA_HOME那行的版本号;Linux 用update-alternatives --config java;Windows 上可以把JAVA_HOME指向一个固定的符号链接目录,切换时只改链接目标。
装完还是报错怎么办?
按报错原文对号入座,这几类覆盖了绝大多数情况:
| 报错 | 原因 | 处理 |
|---|---|---|
| javac 不是内部或外部命令 | PATH 没配,或指到了 JRE | 检查%JAVA_HOME%\bin在不在 PATH 里 |
| invalid target release | 编译用的 JDK 低于目标版本 | 让JAVA_HOME指向目标版本,或调低构建配置 |
| Unsupported class file major version | 运行环境的 JDK 低于编译版本 | 把两端 JDK 统一 |
| IDE 与命令行版本不一致 | IDE 有独立的 JDK 设置 | 在 IDE 的 SDK 设置里单独指定 |
| 改完环境变量不生效 | 终端没重启 | 关掉所有终端窗口重开 |
这里有一条容易被忽略的规则:已经打开的终端和 IDE 不会重新读取环境变量。Windows 上尤其明显,改完必须新开窗口;IDEA 这类 IDE 更特殊,它自己维护一套 JDK 配置,不跟随系统环境变量走,所以系统改对了、IDE 里仍然可能是旧版本。
这套版本对应关系和报错清单我整理成了一份速查表存档,遇到问题直接翻而不是重新推一遍。写这类需要反复核对版本号的事实型内容时,我会用墨衍的AI 图文同步把稿子推到几个平台留档;集中更新的那几天靠发文额度提升不用排队;发完再用批量 GEO 检测看看这些内容在 AI 搜索里被引用的情况。墨衍会员权益 有需要可以了解。
常见问题
Q:JDK 和 OpenJDK 有什么区别?
功能层面基本一致,差别在许可和服务。OpenJDK 是开源实现,多个厂商都会基于它发布自己的构建版本。个人开发用哪个都行,商用前建议看一下对应发行版的许可条款。
Q:新项目该选 JDK 17 还是 JDK 25?
没有历史包袱就选 JDK 25,它是当前 LTS,支持周期最长。如果依赖的框架或中间件还没适配,退回 17 也是可以接受的选择。
Q:为什么装好了 JDK,还是提示找不到 Java?
基本都是环境变量问题:JAVA_HOME多带了\bin、PATH里加的是 JRE 目录、或者环境变量改完没有重开终端。
Q:可以只装 JRE 不装 JDK 吗?
只运行别人的 Java 程序,理论上够用。但现在很多发行版不再单独提供 JRE 包,而且一旦需要编译就会卡住,直接装 JDK 更省事。
Q:真的不需要配 CLASSPATH 吗?
不需要。这是早期 JDK 的历史做法,现代 JDK 和构建工具都会自己管理类路径,配了反而可能引入干扰。
Q:JDK 27 刚发布,要不要直接上?
学习、做实验可以。生产环境建议还是用 LTS,毕竟它的更新只到 2027 年 3 月。
关于墨衍:如果你也在多个平台发技术文章,值得看看墨衍。三个最常用的权益——发文额度提升(密集更新不再受限)、批量 GEO 检测(一次扫完全部文章的 AI 引用状态)、AI 图文同步(一稿多平台分发)。点这里了解墨衍会员