Javac已更新至11.0.2但Java仍为10.0.2的原因及修复方案
嘿,这个问题我之前帮同事排查过好几次,太常见了!咱们先拆解下原因,再一步步解决:
为什么Java和Javac版本会不一致?
这种情况基本都是系统在查找执行文件时,优先找到了旧版本的java.exe,但javac.exe却命中了新的JDK路径,常见原因有这几个:
- Path环境变量顺序搞反了:你更新Path时,可能把JDK11的
bin路径放在了旧JDK10或者系统默认Java路径的后面。系统找程序是按Path里的顺序来的,先找到哪个就用哪个,刚好javac.exe在新路径里先被找到,而java.exe却先匹配到了旧的。 - System32目录残留旧版本Java程序:Windows的
C:\Windows\System32目录在Path里的优先级极高,很多旧版JDK安装时会自动把java.exe、javaw.exe这类文件复制到这里,就算你卸载了旧JDK,这些文件可能还留在那,导致系统优先调用它们。 - JAVA_HOME配置没同步更新:如果你的Path里用了
%JAVA_HOME%\bin这种变量引用,但JAVA_HOME还是指向JDK10,那可能出现部分命令生效部分不生效的情况(不过你这里javac已经更新了,这个概率相对低,但还是要排查)。 - 命令提示符缓存了旧环境变量:改完环境变量后没重启CMD,旧的环境变量还在当前会话里生效,导致部分命令用了新配置,部分还是旧的。
怎么修复这个问题?
按下面的步骤来,基本都能解决:
调整Path环境变量的顺序
- 右键「此电脑」→ 属性 → 高级系统设置 → 环境变量
- 在「系统变量」里找到
Path,点击编辑,把JDK11的bin路径(比如C:\Program Files\Java\jdk-11.0.2\bin)拖动到最顶部,确保它在旧JDK10的路径、C:\Windows\System32之前。 - 别忘了同时检查「用户变量」里的
Path,如果里面也有旧JDK的路径,要么删除要么把新路径移到前面。
清理System32里的残留Java文件
- 打开
C:\Windows\System32文件夹,搜索java.exe、javaw.exe、javaws.exe这几个文件,如果找到,直接删除(需要管理员权限)。这些都是旧版本遗留的,删掉不会影响新JDK的使用。
- 打开
验证并更新JAVA_HOME
- 回到环境变量窗口,检查「系统变量」里的
JAVA_HOME,看是不是指向JDK11的根目录(比如C:\Program Files\Java\jdk-11.0.2),如果还是JDK10的路径,改成新的。
- 回到环境变量窗口,检查「系统变量」里的
重启命令提示符(或电脑)
- 环境变量的修改需要重启CMD才会完全生效,别在原来的窗口里测试,打开一个新的CMD,再输入
java -version和javac -version看看。如果还是不行,重启电脑试试,确保所有配置都加载了。
- 环境变量的修改需要重启CMD才会完全生效,别在原来的窗口里测试,打开一个新的CMD,再输入
检查其他相关变量
- 有些用户会自定义
JAVA_PATH这类变量,或者在Path里有其他引用JDK的配置,比如%JAVA_HOME%\jre\bin,也要确保这些指向的都是JDK11的路径。
- 有些用户会自定义
做完这些步骤,再打开新的CMD窗口测试,应该两个版本就一致了!
内容的提问来源于stack exchange,提问作者Sean2014
相关产品推荐
相关产品推荐

