1. 为什么 2025 年了还要认真对待 JDK 11 的安装
很多人看到"JDK 11 安装教程"这几个字,第一反应是:这有什么好讲的,下一步下一步不就完了?我一开始也这么想,直到帮同事处理一个"明明装了 JDK 却提示找不到 java 命令"的问题,折腾了快一个小时才发现,问题根本不在安装本身,而在环境变量里一个不起眼的顺序问题。从那之后我就意识到,JDK 安装这件事,真正难的不是"装",而是"装完之后能不能被系统正确识别"。
JDK 11 是 Java 发展史上一个非常特殊的存在。它是继 JDK 8 之后第一个长期支持版本(LTS),官方支持周期一直延续到 2026 年甚至更久,所以即便到了 2025 年,大量企业级项目、中间件、构建工具仍然把 JDK 11 作为默认运行环境。你可能已经注意到,身边不少团队一边在用 JDK 17 写新项目,一边还得在本地留一个 JDK 11 来跑老系统,这种"多版本共存"的场景,恰恰是安装环节最容易出问题的地方。
这篇内容我打算讲得实在一点。不是把官网的安装向导复述一遍,而是把下载渠道怎么选、安装路径怎么定、环境变量为什么这么配、配完怎么验证、多版本怎么切换、常见报错怎么排查这几件事一次说透。适合刚接触 Java 的新手,也适合那些装过好几次但每次都要重新查教程的老手。核心关键词就几个:JDK、Java11、安装教程、环境变量,围绕它们展开,不跑题。
先说一个我自己的判断:安装 JDK 这件事,90% 的失败都发生在"环境变量"这一步,而不是安装包本身。所以后面我会把环境变量单独拎出来讲透,包括 Windows、macOS、Linux 三个平台,以及为什么很多人配了JAVA_HOME却依然报错。
2. 下载 JDK 11 之前,先把版本和渠道想清楚
2.1 Oracle JDK 还是 OpenJDK,别选错了
这是第一个岔路口。很多人直接搜"jdk下载",点进第一个结果就下,结果下到的是 Oracle JDK,用着用着发现商用授权有讲究,又得重新换。我的建议是:个人学习、内部测试,用 OpenJDK 发行版完全够用,而且没有授权顾虑。
目前主流的 JDK 11 发行版有这么几个,我列个表对比一下,方便你按需选:
| 发行版 | 维护方 | 特点 | 适合场景 |
|---|---|---|---|
| Oracle JDK | Oracle | 官方原版,商用需注意授权 | 需要官方支持的商业项目 |
| Eclipse Temurin | Eclipse 基金会 | 社区维护,免费,兼容性好 | 绝大多数开发场景首选 |
| Amazon Corretto | 亚马逊 | 免费,长期免费更新 | 云上部署、AWS 生态 |
| Azul Zulu | Azul | 免费,支持多平台 | 跨平台开发 |
| 阿里 Dragonwell | 阿里巴巴 | 国内优化,中文文档友好 | 国内项目、网络下载快 |
我个人的习惯是:本地开发用 Temurin,国内服务器部署用 Dragonwell。原因很简单,Temurin 的兼容性经过大量项目验证,Dragonwell 在国内下载速度快、文档是中文的,遇到问题好查。
2.2 下载渠道:官网和镜像怎么选
官网下载当然最稳妥,但国内访问 Oracle 官网经常慢得让人抓狂,有时候点下载按钮半天没反应。这时候镜像站就派上用场了。国内常用的镜像有清华 TUNA、华为云、阿里云等,搜索"jdk镜像下载"基本都能找到。
提示:从镜像站下载时,一定要核对文件的 SHA256 校验值,确保文件完整没被篡改。官网一般会提供校验值,下载完用命令比对一下,几秒钟的事,能避免很多莫名其妙的安装失败。
具体操作上,以 Temurin 为例,进入官网后选择 Version 11、Operating System(Windows/macOS/Linux)、Architecture(x64/ARM64),然后下载对应的安装包。Windows 一般下.msi或.zip,macOS 下.pkg或.tar.gz,Linux 下.tar.gz。
这里有个细节:Windows 用户优先选.msi安装包,而不是.zip。.msi会自动帮你配好一部分环境变量,.zip是纯解压版,所有配置都得手动来。新手用.msi能少踩不少坑。
2.3 安装路径:别放在带空格和中文的目录
这是很多人忽略的一点。安装路径里如果有空格或者中文,某些老旧的构建工具、脚本会解析出错。我见过最典型的就是路径写成C:\Program Files\Java\jdk-11,结果某个脚本把空格当成了参数分隔符,直接报错。
我的建议是统一放在一个干净、简短、全英文的路径下,比如:
- Windows:
C:\dev\jdk-11 - macOS:
/Library/Java/JavaVirtualMachines/jdk-11.jdk - Linux:
/usr/local/jdk-11
这样后面配环境变量的时候,路径写起来也清爽,不容易出错。
3. Windows 平台安装与环境变量配置全流程
3.1 安装步骤:从双击到完成
如果你下的是.msi包,双击之后基本就是一路 Next,但有两个地方要停一下:
第一,安装路径。默认路径通常是C:\Program Files\Eclipse Adoptium\jdk-11.0.x,我建议改成C:\dev\jdk-11,理由上面说了,避免空格。
第二,是否安装公共 JRE。JDK 11 之后其实已经不再单独提供 JRE 了,安装向导里如果出现这个选项,直接跳过就行,JDK 本身就包含了运行环境。
安装完成后,打开命令行输入java -version,如果能看到版本号,说明安装本身没问题。但注意,这时候能看到版本号,不代表环境变量配好了,因为.msi可能只是把 java 加进了系统路径,JAVA_HOME还是空的,而很多工具(比如 Maven、Gradle)恰恰依赖JAVA_HOME。
3.2 JAVA_HOME 和 Path 到底谁管什么
这是环境变量配置里最核心的问题,我见过太多人把这两个搞混。
简单说:
JAVA_HOME:指向 JDK 的安装根目录,比如C:\dev\jdk-11。它本身不直接让系统找到 java 命令,但它是给其他工具看的"路标"。Maven、Gradle、Tomcat 这些工具启动时会去读JAVA_HOME,然后从里面找 java。Path:系统查找可执行文件的路径列表。只有把%JAVA_HOME%\bin加进Path,你在任意目录敲java才能被找到。
所以正确的做法是:先配JAVA_HOME,再把%JAVA_HOME%\bin加到Path里。顺序反了也能用,但逻辑上不清晰,后面维护容易乱。
具体操作:
- 右键"此电脑" → 属性 → 高级系统设置 → 环境变量
- 在"系统变量"里点"新建",变量名填
JAVA_HOME,变量值填C:\dev\jdk-11 - 找到"系统变量"里的
Path,双击编辑,点"新建",填入%JAVA_HOME%\bin - 一路确定保存
注意:
Path里一定要用%JAVA_HOME%\bin这种引用形式,而不是写死C:\dev\jdk-11\bin。这样以后换 JDK 版本,只要改JAVA_HOME一个地方,Path不用动,省事还不容易出错。
3.3 验证配置:三步确认法
配完之后别急着关窗口,按这三步验证:
第一步,关掉所有已打开的命令行窗口,重新开一个。环境变量是启动时加载的,老窗口不会自动刷新,这是新手最常犯的错。
第二步,依次执行:
echo %JAVA_HOME% java -version javac -versionecho %JAVA_HOME%应该输出你的 JDK 路径;java -version和javac -version都应该输出版本号,而且两者版本要一致。如果java有版本但javac报"不是内部或外部命令",说明Path没配对,或者配到了 JRE 而不是 JDK。
第三步,检查Path里有没有多个 java 路径。有时候系统里装了多个 JDK,Path里排在前面的那个会生效。如果版本不对,去Path里把想要的版本往上挪。
3.4 多版本共存:怎么在 JDK 8、11、17 之间切换
这是 2025 年非常现实的场景。我的做法是:
- 每个版本装到独立目录,比如
C:\dev\jdk-8、C:\dev\jdk-11、C:\dev\jdk-17 JAVA_HOME只指向当前要用的那个- 需要切换时,改
JAVA_HOME的值,重开命令行
如果嫌手动改麻烦,可以写两个批处理脚本,一个切到 11,一个切到 17,双击就切换。脚本内容大概是这样:
@echo off setx JAVA_HOME "C:\dev\jdk-11" /M echo 已切换到 JDK 11,请重开命令行窗口 pausesetx是永久设置环境变量的命令,/M表示系统级。注意执行完必须重开命令行才生效。
4. macOS 与 Linux 下的 JDK 11 配置差异
4.1 macOS:用 pkg 还是手动解压
macOS 上装 JDK 11 有两条路。一条是下.pkg双击安装,它会自动装到/Library/Java/JavaVirtualMachines/下,系统自带的/usr/libexec/java_home工具能识别到。另一条是下.tar.gz手动解压,适合需要精确控制路径的场景。
用.pkg装完之后,验证命令是:
/usr/libexec/java_home -V这个命令会列出系统里所有已安装的 JDK,非常方便。切换版本可以用:
export JAVA_HOME=$(/usr/libexec/java_home -v 11)这行的意思是让系统自动找到 11 版本的路径并赋给JAVA_HOME,比手写路径靠谱。
如果要永久生效,把这行加到~/.zshrc(macOS 现在默认是 zsh)或者~/.bash_profile里,然后source一下。
4.2 Linux:tar.gz 解压 + profile 配置
Linux 上最常见的是下.tar.gz手动解压。步骤是:
tar -zxvf jdk-11.0.x_linux-x64_bin.tar.gz -C /usr/local/ mv /usr/local/jdk-11.0.x /usr/local/jdk-11然后编辑/etc/profile,在末尾加上:
export JAVA_HOME=/usr/local/jdk-11 export PATH=$JAVA_HOME/bin:$PATH保存后执行source /etc/profile让它生效。这里有个细节:$JAVA_HOME/bin要放在$PATH前面,这样新配的 JDK 优先级更高,不会被系统自带的旧版本覆盖。
提示:如果
source之后java -version还是旧版本,用which java看看实际调用的是哪个路径。很多时候是/usr/bin/java这个软链接指向了旧版本,需要手动更新软链接或者调整PATH顺序。
4.3 三个平台配置对比
为了让你一眼看清差异,我整理了个对照表:
| 项目 | Windows | macOS | Linux |
|---|---|---|---|
| 配置文件 | 系统环境变量面板 | ~/.zshrc | /etc/profile |
| 生效命令 | 重开命令行 | source ~/.zshrc | source /etc/profile |
| 版本切换 | 改 JAVA_HOME | java_home -v | 改 JAVA_HOME |
| 常见坑 | Path 顺序 | shell 类型 | 软链接指向 |
这张表建议存下来,换平台的时候对照着看,能省不少查资料的时间。
5. 环境变量配置失败的那些坑,我一个个踩过
5.1 "不是内部或外部命令"的三种可能
这个报错太经典了,我总结下来无非三种原因:
第一种,Path没配或者配错。检查Path里有没有%JAVA_HOME%\bin,注意是bin目录,不是 JDK 根目录。很多人只配了JAVA_HOME忘了配Path,结果就是echo %JAVA_HOME%有输出,但java命令找不到。
第二种,配了但没生效。环境变量改完必须重开命令行,老窗口读的还是旧配置。这个坑我踩过不止一次,明明配对了却一直报错,最后发现是窗口没关。
第三种,路径里有空格或中文。前面提过,Program Files里的空格会让某些解析出问题。解决办法就是换到无空格路径。
5.2 JAVA_HOME 配了却依然报错
这种情况通常是工具读的不是你配的那个JAVA_HOME。比如你在用户变量里配了,但工具读的是系统变量;或者你配了系统变量,但当前 shell 里有个临时变量覆盖了它。
排查方法:在命令行里执行echo %JAVA_HOME%(Windows)或echo $JAVA_HOME(macOS/Linux),看看输出是不是你期望的路径。如果不是,说明有更高优先级的变量在起作用。
还有一种情况是路径末尾多了个反斜杠或空格。比如C:\dev\jdk-11\末尾带斜杠,某些工具拼接路径时会变成C:\dev\jdk-11\\bin,虽然多数情况能容错,但个别工具会报错。养成不加末尾斜杠的习惯。
5.3 版本冲突:系统里装了多个 JDK 怎么办
Windows 上可以用where java命令列出所有 java 可执行文件的路径,按Path顺序排列,排第一的就是当前生效的。macOS/Linux 用which -a java。
如果发现生效的不是想要的版本,就去调整Path顺序,或者直接改JAVA_HOME。我一般建议只保留一个 JDK 在Path里,其他版本通过切换JAVA_HOME来用,这样最不容易乱。
5.4 一个容易被忽略的点:IDE 里的 JDK 设置
很多人系统环境变量配好了,命令行也验证通过了,但打开 IDEA 或 Eclipse 新建项目还是报错。这是因为IDE 有自己的 JDK 配置,不一定读系统环境变量。
以 IDEA 为例,需要在File → Project Structure → SDKs里手动添加 JDK 路径,然后在Project里选择对应的 SDK。这一步不做,IDE 用的可能还是它自带的或者之前配的旧版本。
提示:IDE 里配 JDK 时,指向的应该是 JDK 根目录,不是
bin目录。这点和JAVA_HOME一致,别搞混。
6. 装完之后,怎么确认这套环境真的能用
6.1 写个最小程序跑一遍
光看版本号还不够,最好实际编译运行一个程序。新建一个Hello.java:
public class Hello { public static void main(String[] args) { System.out.println("JDK 11 环境正常,版本:" + System.getProperty("java.version")); } }然后:
javac Hello.java java Hello如果输出里带着 11 的版本号,说明编译和运行链路都通了。这一步能同时验证javac和java两个命令,比单看版本号更靠谱。
6.2 检查 JAVA_HOME 是否被工具正确识别
如果你用 Maven,可以执行mvn -version,输出里会显示它使用的 Java 版本和JAVA_HOME路径。如果这里显示的版本不对,说明 Maven 读到的JAVA_HOME有问题,回头检查环境变量。
Gradle 类似,gradle -version也会显示 JVM 信息。这一步是验证"工具链是否打通"的关键,很多人命令行能跑但构建工具报错,问题就出在这。
6.3 常见验证命令速查
| 命令 | 作用 | 期望结果 |
|---|---|---|
| java -version | 查看运行时版本 | 显示 11.x |
| javac -version | 查看编译器版本 | 显示 11.x |
| echo %JAVA_HOME% | 查看变量值 | 显示 JDK 路径 |
| where java | 列出 java 路径 | 第一行为目标 JDK |
| mvn -version | 查看 Maven 用的 JDK | 显示 11.x |
这张表可以当成装完后的自检清单,逐条过一遍,基本就不会有遗漏。
7. 我这些年攒下的几个实操心得
第一个心得:装 JDK 之前先想清楚要用哪个版本,别装完再纠结。2025 年新项目建议直接上 JDK 17 或 21,但如果你要维护老系统,JDK 11 是绕不开的。提前规划好,能避免反复卸载重装。
第二个心得:环境变量配置尽量用引用而不是写死路径。%JAVA_HOME%\bin这种写法,换版本时只改一处,维护成本低。写死路径的话,每次换版本都要改好几处,容易漏。
第三个心得:遇到问题先看echo输出,再怀疑其他。环境变量的问题,90% 通过echo %JAVA_HOME%和where java就能定位。别一上来就重装,先看变量对不对。
第四个心得:多版本共存时,给每个版本写个切换脚本。Windows 用.bat,macOS/Linux 用.sh,双击或一行命令就能切,比手动改环境变量快得多,也不容易改错。
第五个心得:IDE 的 JDK 配置和系统环境变量是两回事。系统配好了不代表 IDE 配好了,新建项目前先在 IDE 里确认 SDK 设置,能省掉很多"明明配了却报错"的困惑。
最后再补一句,JDK 安装这件事,看起来简单,但真正把它配得干净、可维护、多版本友好,是需要一点经验的。上面这些内容都是我在实际项目里一点点试出来的,希望能帮你少走点弯路。如果你在配置过程中遇到什么奇怪的现象,大概率能在前面几个章节里找到对应的排查思路。