
1. 先确认你要装的到底是哪一个 JDK8帮人配 win10 下的 jdk8 安装和环境变量是我这些年里被问得最多的一件小事。它听起来简单属于点几下鼠标就能完事的那类任务但真正动手的时候翻车姿势之多会让你怀疑人生装完了 java -version 有输出、javac -version 却报javac 不是内部或外部命令或者明明配了 JAVA_HOMEMaven 一跑就提示找不到 JDK再或者重启电脑之后一切又回到了原点。我见过最离谱的一次是同事把 JAVA_HOME 指向了安装目录里的 jre 子文件夹命令行看着一切正常结果只要涉及到编译就全崩他排查了整整一个下午。这篇文章面向两类人一类是刚接触 Java、需要在自己电脑上从零搭一套能跑 hello world 的开发环境的新手另一类是有经验、但每次配 java 环境变量都要重新搜一遍、想一次把原理弄清楚以后不再踩坑的开发者。我会从选哪个版本一路讲到多版本共存怎么切换把每一步背后的理由也讲清楚让你配完这一次之后以后再遇到 jdk 环境变量配置失败能自己定位问题在哪。1.1 2025 年为什么还有这么多人必须装 JDK8先说一个现实JDK8 发布于 2014 年按常理早该进博物馆了但直到现在国内相当一部分企业项目仍然跑在 JDK8 上。原因不复杂——很多老系统基于 Spring 4、Struts、或者更早期的内部框架构建升级 JDK 的成本远高于继续维护的成本还有一些中间件、报表引擎、老版本的 Tomcat 和构建脚本对高版本 JDK 的模块化JPMS改动非常敏感一升就报一堆java.lang.NoClassDefFoundError和反射相关的错误。所以现实情况是你可以用 JDK17 写新项目但你手上那台 win10 开发机大概率还是得同时装一个 JDK8。这就引出了一个关键认知JDK 不是装了新的就删旧的而是多版本共存、按项目切换。你后面会看到环境变量那套机制本身就是为了支持这种切换而设计的理解了这一点很多事情就顺了。1.2 Oracle JDK 8、OpenJDK 8、Temurin、Corretto 到底选哪个这是新手最容易犯迷糊的地方。市面上叫 JDK8 的东西有好几个来源它们内核同源但发布方、授权条款、更新频率和目录结构都有差别。发行版本提供方授权特点适合谁Oracle JDK 8u202 及更早Oracle可免费用于生产需要历史版本、老项目对齐Oracle JDK 8u211 及以后Oracle商用需订阅授权建议仅个人学习使用Eclipse Temurin 8原 AdoptOpenJDKEclipse 基金会免费、开源、长期维护绝大多数人的首选Amazon Corretto 8Amazon免费、含长期安全补丁部署到云端时更省心Azul Zulu 8Azul免费版本可用需要特定平台支持时国内大厂构建版如龙井、毕昇等各厂商免费信创环境或国内网络环境给一个明确建议如果没有特殊的历史包袱直接选 Eclipse Temurin 8 或者 Amazon Corretto 8 的 Windows x64 版本。它们的安装包结构清晰、长期有安全更新、授权上没有后顾之忧。只有当你的项目明确要求必须和线上服务器的 Oracle JDK 8u202 保持一致时才去费劲找 Oracle 的老版本归档。还有一个坑要提前说网上搜jdk8下载与安装教程排在前面的往往是各种第三方下载站的打包安装器这类安装包有时会捆绑推广软件或者在安装过程中偷偷改你的浏览器主页和 PATH。尽量从发行方的官方站点下载文件名一般长这样OpenJDK8U-jdk_x64_windows_hotspot_8u4xxbxx.msi或者amazon-corretto-8.x.x.x-windows-x64.msi看到带 setup、绿色版、汉化版 字样的多留个心眼。1.3 32 位还是 64 位JDK 和 JRE 的关系别搞反现在还在用 32 位 Windows 的机器基本只剩老工控设备了绝大多数人下载 x64 版本就对了。判断方法很简单Win R输入winver看一眼或者打开此电脑右键属性系统类型里会写明。如果你的机器是 ARM 架构比如某些 Surface那要选 aarch64 版本选错了装不上或者装上了跑不动。至于 JDK 和 JRE用一句话说明白JRE 是运行环境只能跑 Java 程序JDK 是开发工具包里面包含了 JRE还额外带了 javac 编译器、jar 打包工具、jdb 调试器等一堆开发工具。你要写代码、要编译就必须装 JDK。很多人环境变量配完java -version正常但javac找不到根源就是 JAVA_HOME 指错了地方——指到了 JRE 目录。这个坑我们后面单独拆。2. 安装路径这一步决定了后面会不会翻车大部分人装软件的习惯是下一步下一步完成路径全部默认。对普通软件这没问题但对 JDK安装路径的选择会直接影响后面环境变量配得顺不顺。这一段值得你花两分钟认真看。2.1 从官网下载安装包时要注意的两个细节第一个细节是文件格式。Windows 上有.exe和.msi两种安装包还有一种是.zip免安装版。三者的区别.exe最常见的安装向导双击一路下一步会自动写注册表、会往系统 PATH 里塞东西这点后面细说。.msiWindows Installer 包Temurin 和 Corretto 主要提供这种。它更规矩支持静默安装和命令行参数卸载也干净。.zip解压即用不写注册表、不动 PATH对于想完全手动控制环境变量的开发者来说反而最省心。第二个细节是下载时别只看文件名要看校验值。官方站点一般会提供 SHA256 校验码下载完可以用 PowerShell 跑一句Get-FileHash .\文件名 -Algorithm SHA256对比一下。这一步很多人跳过但如果你是在公共网络下载的花十秒钟校验能避免装上一个被篡改过的包。这不是焦虑营销是真实存在的风险。2.2 为什么不建议把 JDK 装在 Program Files 里默认安装路径通常是C:\Program Files\Java\jdk1.8.0_xxx\。这个路径有两个问题第一路径里带空格。空格本身在 Windows 命令行里是合法的但 JDK 生态里有大量历史遗留的脚本、批处理文件和构建工具它们对含空格路径的处理各不相同。有的会用引号包起来有的不会有的工具在拼接路径时直接字符串相加结果就是C:\Program Files\...被拆成两段。你会遇到一些莫名其妙的报错比如某个插件加载失败、某个构建脚本报 系统找不到指定的路径。新手根本想不到问题出在安装路径的空格上能查一天。第二权限问题。C:\Program Files是受保护目录普通用户没有写权限。日常开发中某些工具尤其是那些喜欢把临时文件、缓存往 JDK 目录里写的会因为权限不足静默失败。虽然不算常见但一旦出现排查难度很高。所以我的建议是统一装到一个短路径、无空格、无中文的目录下比如D:\Develop\Java\jdk1.8.0_202 D:\Develop\Java\jdk-11.0.20 D:\Develop\Java\jdk-17.0.9这种命名方式一眼就能看出每个目录是什么版本后面多版本切换的时候非常方便。如果你只有一个 C 盘那就用C:\Java\这样的短路径同样效果。注意安装向导里的更改按钮有时候不生效或者改完之后它又把 JRE 装回了默认位置。装完一定要去目标目录确认一下文件确实在。2.3 安装向导里公共 JRE这个选项能跳过就跳过Oracle JDK 8 的安装向导中间会弹出一个界面问你要不要安装公共 JRE默认是勾选的还会显示一个路径指向C:\Program Files\Java\jre1.8.0_xxx。这个公共 JRE 是后面很多环境变量配了但没生效问题的元凶之一。原因在于安装公共 JRE 的时候安装程序会做两件事在C:\ProgramData\Oracle\Java\javapath\目录下创建一组 java.exe、javaw.exe、javac.exe 的快捷方式把C:\ProgramData\Oracle\Java\javapath这个路径加到系统的 PATH 变量里而且通常加在最前面。结果就是你后面辛辛苦苦配的%JAVA_HOME%\bin确实加进去了但系统在 PATH 里从前向后找可执行文件时先找到了 javapath 里那一组快捷方式于是你执行的其实是那个 JRE不是你的 JDK。表现出来就是java -version有输出但版本号可能不对或者javac -version直接找不到因为公共 JRE 里压根没有 javac。处理办法有两个做法一推荐安装时直接在下拉菜单里把公共 JRE 选为不安装或者取消勾选。JDK 自带一个 JRE 在它自己的目录下够用了。做法二如果已经装上了去系统 PATH 里把C:\ProgramData\Oracle\Java\javapath这一条删掉或者把你的%JAVA_HOME%\bin移到它前面。注意是系统变量里的 PATH不是用户变量。这两种做法我都用过做法一更干净。已经踩了坑的按做法二处理删掉之后记得重开命令行窗口验证。3. JAVA_HOME、PATH、CLASSPATH 这三个变量的真实分工很多人配环境变量是照着教程抄抄完不知道为什么。这一节把三个变量的职责讲清楚你以后遇到任何 java 环境变量配置问题都能自己推理出原因。3.1 JAVA_HOME不是给 java 命令用的是给别的工具用的这是个反直觉的点。你在命令行敲java -version系统根本不看 JAVA_HOME——它只看 PATH。那 JAVA_HOME 到底有什么用答案是JAVA_HOME 是给需要调用 Java 的其他程序看的约定俗成的变量名。典型的有Maven启动脚本里会读%JAVA_HOME%\bin\java.exeGradle同样读 JAVA_HOMETomcatcatalina.bat里会检查 JAVA_HOME没有就报错IDEA、Eclipse、VS Code 的 Java 插件初始化时会尝试从 JAVA_HOME 探测 JDK 位置各种命令行工具、构建脚本、容器化工具链默认都认这个名字。所以 JAVA_HOME 的价值在于提供一个统一的当前 JDK 是哪个的开关。你想从 JDK8 切到 JDK17改这一个变量的值就行其他所有工具自动跟着变。这就是它能支撑多版本切换的原因。JAVA_HOME 的值应该指向JDK 的根目录不是 bin也不是 jre正确D:\Develop\Java\jdk1.8.0_202 错误D:\Develop\Java\jdk1.8.0_202\bin 错误D:\Develop\Java\jdk1.8.0_202\jre值末尾不要加反斜杠。Windows 本身对D:\Java\jdk\\bin这种多一个斜杠的路径通常是宽容的但 Maven、Gradle 或者某些 Linux 上用的 shell 脚本移植到 Windows 之后遇到尾部斜杠可能会拼出D:\Java\jdk\\bin\java这种字符串某些严格校验的工具会直接报路径无效。3.2 PATH决定你在命令行敲 java 时执行的是哪一个PATH 是一个用分号分隔的目录列表。你在命令行输入java系统会按 PATH 里的顺序从左到右挨个目录找名为 java.exe或 java.cmd、java.bat的文件找到第一个就执行后面的不管了。这个从左到右、找到即停的规则是所有 PATH 相关问题的核心。它解释了为什么安装公共 JRE 后你配的 JDK 不生效——因为 javapath 排在你前面装了多个 JDK 但切换不灵——因为某一个的 bin 目录排在前面把后面全遮住了改了 PATH 但命令行没反应——因为已经打开的命令行窗口会缓存 PATH 的旧值必须关掉重开。我们要往 PATH 里加的东西是%JAVA_HOME%\bin。注意这里用的是变量引用而不是写死路径。用%JAVA_HOME%\bin的好处是以后改 JAVA_HOME 就能切换 JDK 版本PATH 完全不用动。写死路径的话每次换版本都要回 PATH 里改很容易漏。在系统变量 PATH 里引用%JAVA_HOME%时系统会先去解析这个变量。这里有个细节用户变量和系统变量是两套独立的作用域。系统变量 PATH 在解析时能看到系统变量里的 JAVA_HOME但看不到用户变量里的 JAVA_HOME顺序上系统变量先于用户变量处理。所以如果你把 JAVA_HOME 建在用户变量里把%JAVA_HOME%\bin加到系统 PATH 里有概率解析失败。最简单的原则JAVA_HOME 和 PATH 都建在同一个作用域下要么都用系统变量要么都用用户变量。我个人习惯两个都用系统变量因为这样对所有用户和对以管理员身份运行的命令行都生效。3.3 CLASSPATH老教程里的必配项现在建议直接不配只要你搜 jdk1.8 配置环境变量十篇里至少有八篇会让你新建一个叫CLASSPATH的变量值是.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar这个配置来自 Java 1.4 之前的年代。那时候运行一个 class 文件如果没指定 CLASSPATHJava 就不会自动去当前目录找所以必须加一个.表示当前目录。而 dt.jar 和 tools.jar 里放的是编译器和一些工具类老版本需要显式声明。从 Java 6 开始如果 CLASSPATH 没有设置Java 会默认把它当作.当前目录。同时dt.jar、tools.jar 这些也不需要通过 CLASSPATH 手工引入了。换句话说现在的 JDK8 完全不需要配 CLASSPATH。更要命的是如果你配错了 CLASSPATH反而会引入问题。最典型的手抖把开头的.漏掉了导致运行当前目录下的 class 文件时报ClassNotFoundException你会盯着代码查半天最后发现是环境变量的问题在 CLASSPATH 里写了通配符但路径不对导致加载到了错误的依赖版本出现各种诡异的NoSuchMethodError。所以我的明确建议如果你的机器上还没有 CLASSPATH 这个变量就不要建。如果已经有了先留着不动也没关系但要知道它现在的默认值就是.你不需要额外操作。4. 手把手配置每一步的具体坐标和填写内容前面铺垫了原理这一段开始动手。配置环境变量这个操作本身只有几分钟但入口藏得比较深第一次找容易懵。4.1 打开环境变量面板的四种方式Windows 10 里至少有四条路能走到环境变量设置界面挑你顺手的图形入口最稳右键此电脑 → 属性 → 右侧或底部的高级系统设置 → 弹出的窗口里点环境变量。如果右侧没看到可以点一下相关设置里的高级系统设置。运行命令最快Win R输入sysdm.cpl回车直接进系统属性窗口然后点高级标签页 → 环境变量。直达命令最少点击Win R输入rundll32.exe sysdm.cpl,EditEnvironmentVariables回车直接弹出环境变量对话框。注意这行里有个英文逗号别打成中文逗号否则不生效。搜索框任务栏搜索框输入环境变量会出来编辑系统环境变量的入口。打开之后你会看到上下两个区域上半部分是用户变量只对当前登录用户生效下半部分是系统变量对所有用户生效。前面说了建议统一用系统变量。如果你的机器是个人电脑、只有一个账户用用户变量也能跑通但要注意前面提到的跨作用域引用问题。提示这个窗口里所有操作点确定才会真正保存。很多人改完 Path 直接把窗口叉掉改动全丢了然后回头抱怨环境变量配置失败。改完一层层点确定退出去退到最后那个环境变量窗口也要点确定。4.2 新建 JAVA_HOME 的具体填法在系统变量区域点新建弹出的小窗口里变量名JAVA_HOME全大写下划线分隔不要写成JAVA-HOME或者JavaHome虽然 Windows 不区分大小写但很多工具的脚本是区分大小写的比如 shell 脚本里$JAVA_HOME换个写法就取不到值变量值你的 JDK 根目录例如D:\Develop\Java\jdk1.8.0_202填完点确定。填的时候建议直接从文件资源管理器的地址栏复制路径避免手敲出错——特别是jdk1.8.0_202这种带下划线和点号的目录名打错一个符号后面就是一条报错。4.3 编辑 Path 时 Win10 那个列表编辑器要注意什么Win10 的 Path 编辑体验比 Win7 好很多选中Path点编辑会弹出一个列表式的编辑器每行一个路径用右侧的按钮新建、上移、下移、删除。这里有几个新人容易卡住的地方第一新建的条目不会自动加%JAVA_HOME%\bin。你要点新建然后在那一行里手动输入%JAVA_HOME%\bin。输入完成后按回车或者点别的地方让它失去焦点如果这行还是可编辑状态而你没确认点确定的时候可能会丢掉。第二顺序很重要。用右边的上移按钮把%JAVA_HOME%\bin往上挪挪到所有 Java 相关路径的最前面尤其要在C:\ProgramData\Oracle\Java\javapath前面。如果你不想用上移可以直接把 javapath 那条删掉。第三你可能找不到编辑文本按钮。新版的列表编辑器里右下角有个编辑文本按钮点了会切换成传统的一整行文本、分号分隔的模式。这个模式适合批量粘贴但要注意粘贴进来的路径里不能带引号。有些教程给的写法是%JAVA_HOME%\bin加了引号在列表模式下会被当成路径的一部分反而失效。除非路径本身含空格必须用引号而我们前面已经建议避开空格了否则不要加引号。第四别把原有的内容删了。尤其是列表模式下能看到系统自带的C:\Windows\system32、C:\Windows这些一个字都不能动。删了之后会出现cmd 打不开系统命令全找不到这类严重问题。改之前先把当前 Path 的值整段复制出来粘到记事本里存一份出事了能还原。4.4 用命令行批量配置的方式适合要配多台机器如果你要给多台机器配置或者就是懒得点鼠标可以用命令行。以管理员身份打开命令提示符然后:: 设置 JAVA_HOME/M 表示写入系统变量不加则写用户变量 setx JAVA_HOME D:\Develop\Java\jdk1.8.0_202 /M :: 把 %JAVA_HOME%\bin 追加到系统 Path :: 注意下面的写法会直接覆盖原 Path 里的内容请不要照抄第二行千万不要直接照抄。setx PATH ...是覆盖而不是追加它会把你原本那一长串系统 PATH 全部替换掉后果非常严重系统可能直接起不来或者找不到基本命令。正确的追加做法应该是先读取再拼接for /f skip2 tokens2,* %a in (reg query HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment /v Path) do setx PATH %b;%%JAVA_HOME%%\bin /M即便如此setx还有两个众所周知的问题它会截断超过 1024 个字符的值。系统 PATH 很容易超过这个长度一旦被截断后面那些路径全部丢失。它写入的值里%会被转义处理如果你想写入%JAVA_HOME%\bin这样的字面量需要写成%%JAVA_HOME%%\bin很容易搞错。所以我给的实际建议是命令行只用来设置 JAVA_HOME 这种短值PATH 老老实实用图形界面改。看着麻烦但它不会把你的系统搞崩。我见过两次因为 setx 覆盖 PATH 导致的系统异常修复过程比配环境变量麻烦十倍。5. javac 不是内部或外部命令完整排查链路配置完就该验证了。但很多人的第一次验证是失败的报错信息是这两句之一java 不是内部或外部命令也不是可运行的程序或批处理文件。 javac 不是内部或外部命令也不是可运行的程序或批处理文件。下面按从最可能到最不可能的顺序给你一条完整的排查路径。建议按顺序走不要跳跳着查很容易在错误的方向上花时间。5.1 第一层确认窗口是不是新的这一条排在第一是因为它造成的失败比例最高。已经打开的命令行窗口不会感知到你在图形界面里改的环境变量。你必须把原来那个 cmd / PowerShell 窗口完全关掉重新打开一个新的新窗口才会读取到最新的环境变量。我见过太多次改完变量回到原来那个 cmd 敲java -version报错然后开始怀疑人生。其实只要重开一个窗口就好。重开之后依次敲这三条echo %JAVA_HOME% java -version javac -version第一条如果输出%JAVA_HOME%你自己而不是路径说明这个变量没定义回去检查是不是建在了用户变量而你在系统上下文里执行或者名字拼错了。第二条如果输出了java version 1.8.0_xxx说明 java 命令找到了。但先别高兴如果版本号不是你想要的那个比如你想的是 1.8 结果输出了 17说明 PATH 顺序还是有问题有别的 JDK 排在前面。第三条才是真正的试金石。javac -version输出了javac 1.8.0_xxx才算配完。如果 java 有输出但 javac 没有那基本可以确定是JAVA_HOME 指到了 JRE 目录或者你 PATH 里加的是%JAVA_HOME%\jre\bin。回去看 JAVA_HOME 的值末尾不该有\jre。5.2 第二层用 where 命令看系统到底找到了什么如果重开窗口还是不行用where命令往下挖where java where javac这个命令会按 PATH 顺序列出所有匹配的路径非常直观。正常情况下应该输出类似D:\Develop\Java\jdk1.8.0_202\bin\java.exe C:\Windows\System32\java.exe看第一行。如果第一行是你配置的路径说明 PATH 顺序没问题如果第一行是C:\ProgramData\Oracle\Java\javapath\java.exe或者C:\Windows\System32\java.exe说明有东西排在前面把它遮住了需要去 PATH 里调整顺序。where javac如果完全没有输出说明 PATH 里任何一个目录下都找不到 javac.exe。这就明确指向了 JAVA_HOME 指错位置的问题——去%JAVA_HOME%\bin目录下看看到底有没有javac.exe这个文件。没有的话JAVA_HOME 一定指错了。另外补充一句关于C:\Windows\System32\java.exe的坑某些安装过旧版 Java 或者装过 Java 应用比如某些老版本的开发工具、Office 插件的机器上System32 目录里会残留一个 java.exe。System32 在 PATH 里几乎总是排在最前面它会把你的配置完全遮住。解决方法就是去那个目录里看一下如果确实有个不该在那儿的 java.exe把它删掉需要管理员权限并且确认不是系统组件。5.3 第三层常见报错对照表把上面几层排查中可能遇到的症状整理成一张表方便你直接对号入座。现象大概率原因处理方式java 和 javac 都找不到PATH 没保存成功或窗口没重开检查 PATH 里是否有%JAVA_HOME%\bin重开窗口java 正常但 javac 找不到JAVA_HOME 指向了 jre 目录把 JAVA_HOME 改回 JDK 根目录java 版本号不是预期的PATH 里别的 JDK 排在前面上移%JAVA_HOME%\bin或删除 javapathecho %JAVA_HOME% 输出原样变量未定义或作用域不对检查变量名拼写和作用域报错里出现C:\Program被截断安装路径含空格脚本没加引号重装到无空格路径IDEA 找不到 JDKIDE 不读 PATH只读自己的配置在 IDE 里手动指定 JDK 路径Maven 报 No compiler is providedMaven 读的是 JAVA_HOME指向了 JRE修正 JAVA_HOME重启命令行重启电脑后配置失效改的是临时变量或用了 set 命令用图形界面或 setx 重新设置5.4 两个隐蔽到离谱的细节第一个是变量嵌套的延迟展开问题。当你在 PATH 里用%JAVA_HOME%\bin理论上系统会自动展开。但在某些场景下比如你在同一行批处理里先 set JAVA_HOME 再引用 PATH因为批处理是在解析整行之前就展开了变量会取到旧值。这种情况需要用setlocal enabledelayedexpansion配合!JAVA_HOME!语法。日常手工配置不会遇到但如果你在写自动化部署脚本这个坑一定会碰到。第二个是路径里的中文。有些人习惯把开发工具装在D:\开发工具\Java\这样的目录下Windows 本身是支持的但很多 Java 工具在读取路径时用的编码不是 UTF-8遇到中文目录会出现乱码、找不到文件、编译输出目录创建失败等问题。最保险的做法依然是全英文路径这个成本最低。6. 多版本 JDK 共存8、11、17 怎么和平相处实际工作里一台机器上装两三个 JDK 是常态。这一节讲怎么让它们互不干扰并且能快速切换。6.1 用版本专属变量 一个总开关的布局不要在 PATH 里塞三个 bin 目录那是在给自己制造混乱。推荐的做法是先给每个版本建一个专属变量JAVA_HOME_8 D:\Develop\Java\jdk1.8.0_202 JAVA_HOME_11 D:\Develop\Java\jdk-11.0.20 JAVA_HOME_17 D:\Develop\Java\jdk-17.0.9然后建一个JAVA_HOME值暂时填%JAVA_HOME_8%注意这里可以用变量引用变量Windows 是支持的——前提是JAVA_HOME_8和JAVA_HOME在同一个作用域下。PATH 里只保留一条%JAVA_HOME%\bin。这样一来切换版本只需要改JAVA_HOME一个值要用 JDK8把 JAVA_HOME 改成%JAVA_HOME_8%要用 JDK17改成%JAVA_HOME_17%改完重开命令行java -version和javac -version一起变。干净、可回溯出问题了也好定位。6.2 应用程序各自从哪里读 JDK别指望 PATH 通吃这是新手最大的认知误区以为配好环境变量所有程序就都听话了。实际上大部分 IDE 和构建工具是各自为政的。IDEA有全局的 SDK 设置File → Project Structure → SDKs和项目级的 SDK 设置。它初始化时可能会从 JAVA_HOME 探测一次但之后完全按自己的配置走。你想让某个项目用 JDK8就在项目结构里单独指定。Eclipse在eclipse.ini里通过-vm参数指定 JDK 路径或者用 Preferences → Java → Installed JREs 配置。注意-vm参数要写在-vmargs前面。Maven默认读 JAVA_HOME。如果你在命令行跑 Maven 而 JAVA_HOME 指向 JDK17那编译用的就是 17跟 IDEA 里的设置无关。这也是IDEA 里能编译、命令行 mvn 报错这类问题的常见原因。Gradle同样默认读 JAVA_HOME还可以通过org.gradle.java.home在gradle.properties里覆盖。VS Code / Cursor 的 Java 插件靠java.jdt.ls.java.home这个配置项或者读 JAVA_HOME。如果你在 Cursor 里写 Java 发现补全失效、提示找不到 JDK基本就是插件没找到 JDK 路径手动配一下这个设置项就好。Tomcatcatalina.bat里读 JAVA_HOME没有就报错退出。理解了这一点你就能解释一个很常见的现象命令行里 java 版本是对的但 IDE 里编译报语法错误——那是因为 IDE 用的根本不是你命令行里那个 JDK。想查清楚某个工具到底用了哪个 JDK最直接的办法是在它自己的设置界面或者日志里找。6.3 写个批处理脚本一键切换如果你切换版本很频繁可以写两个批处理文件放在桌面或 PATH 包含的目录里。use-jdk8.bat内容如下echo off setx JAVA_HOME %%JAVA_HOME_8%% /M echo 已切换到 JDK8请重新打开命令行窗口生效。 pause注意这里%%JAVA_HOME_8%%的写法是为了让setx写入的是变量引用而不是展开后的字面路径。/M表示写入系统变量如果你的环境变量建在用户变量下要去掉/M。同理写一个use-jdk17.bat。一定要以管理员身份运行这些脚本否则写系统变量会失败提示错误: 拒绝访问注册表项。注意setx写入的值对当前已经打开的所有窗口都无效只是给以后新开的进程用。所以脚本执行完必须重开窗口。另外提一句如果你是在虚拟机里专门搭一套练习环境建议在配置之前先给虚拟机打一个快照。环境变量这种东西一旦配乱了想回退比重新装系统快得多的方式就是回滚快照。这是个很省时间的习惯。7. 配完之后容易被忽略的几件收尾事环境变量配完、验证通过很多人就收工了。但下面这几件事如果不处理过一段时间可能会冒出来给你添麻烦。第一卸载 JDK 不是删文件夹就完事。如果你之前装过别的版本只是把目录删掉了注册表里、系统 PATH 里、C:\ProgramData\Oracle\Java\javapath里的残留都还在。表现就是java -version还能输出、where java还能找到路径但那个路径其实已经不存在了。正确的卸载方式是走设置 → 应用 → 应用和功能找到对应条目卸载然后再手工清理 PATH 里剩下的那一条。第二JDK 目录下的cacerts文件值得知道一下。这个文件在%JAVA_HOME%\jre\lib\security\JDK9 之后在%JAVA_HOME%\lib\security\下是 Java 的根证书库。当你遇到 HTTPS 请求报sun.security.validator.ValidatorException: PKIX path building failed的时候根因就是某个服务端证书的签发链不在这个库里。这种情况在企业内网自签证书的环境下特别常见处理方式是用keytool命令把证书导入进去。知道有这么个文件比出事之后从零开始搜要快得多。第三控制面板里那个 Java 图标管的是什么。装完 Oracle JDK 之后控制面板里会多一个 Java 图标点开是 Java 控制面板。它管的是浏览器里 Java 插件的行为、临时文件缓存位置、以及 JVM 的全局运行参数。日常开发基本用不到它但它有一个实用功能查看当前系统里注册了哪些 Java 运行时Java 标签页 → 查看。如果你怀疑有残留的 JDK 影响环境来这儿看一眼能一目了然。另外那个临时文件的缓存目录偶尔会占几个 G 的空间清理一下能腾出不少磁盘。第四环境变量改乱了怎么恢复。前面反复强调改 PATH 之前备份这里给个恢复思路如果你还留着原始的 PATH 文本直接粘回去如果没有Windows 有一个默认的系统 PATH 值可以参考——通常是C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\这几条打底。实在恢复不了可以在另一台同版本 Windows 上把系统 PATH 完整复制过来作为参照逐条补回。我个人的习惯是每配完一台新机器的环境就把用户变量和系统变量的完整内容分别导出成 txt跟这台机器的系统版本、镜像信息放在同一个文件夹里。换机器或者重装的时候直接对着看就行不用再凭记忆重建一遍。这个习惯帮我省过至少两次大麻烦——一次是同事的机器环境被某安装程序改乱了一次是我自己重装系统之后忘了当初配过哪些自定义变量。最后分享一个判断你到底该不该配这个变量的小标准如果一个变量只被某一个工具使用那它更适合配在那个工具自己的配置文件里而不是全局环境变量里。全局环境变量越少出问题的面就越小。JAVA_HOME 之所以值得全局配是因为认它的工具实在太多了。