根本原因是path环境变量未正确配置,应仅添加%java_home%\bin,而非%java_home%\jre\bin(jdk 21无独立jre目录);需确保java_home指向jdk根目录、path中无引号或空格、修改后重启cmd验证where javac。

JDK 21安装后javac命令报“不是内部或外部命令”?根本原因几乎全是Path变量没配对,而不是JAVA_HOME设错。
只加%JAVA_HOME%\bin,别加%JAVA_HOME%\jre\bin
JDK 21不再自带独立的jre目录——它把运行时整合进bin和lib里了。旧教程里常写的%JAVA_HOME%\jre\bin在JDK 21中根本不存在,硬加会导致路径无效,还可能干扰其他JDK版本。
- 打开文件资源管理器,进入你的JDK 21安装目录(比如
C:\Program Files\Java\jdk-21.0.4),确认里面没有jre这个子文件夹 - 只往
Path里新增一条:%JAVA_HOME%\bin - 如果之前加过
%JAVA_HOME%\jre\bin,请手动删掉
Path条目必须用%JAVA_HOME%\bin,别写死绝对路径
写死路径(如C:\Program Files\Java\jdk-21.0.4\bin)看似省事,但一旦升级JDK或换机器,所有依赖该路径的配置都要重改;而用%JAVA_HOME%变量能解耦路径与逻辑,也方便多版本切换。
-
JAVA_HOME值必须是JDK根目录,不是bin目录(错误示例:C:\...\jdk-21.0.4\bin) -
Path里新增项必须以%JAVA_HOME%\bin形式出现,且不能带空格或引号 - 验证方式:在CMD里执行
echo %JAVA_HOME%,应输出完整路径;再执行where javac,应返回%JAVA_HOME%\bin\javac.exe的绝对路径
新增Path条目后,CMD必须新开才能生效
Windows不会自动刷新已打开的命令行窗口的环境变量。哪怕你点了一百次“确定”,旧CMD窗口里的PATH还是老的。
- 关闭所有已打开的CMD、PowerShell、IDE终端(包括IntelliJ、VS Code内置终端)
- 按
Win + R→ 输入cmd→ 回车,打开全新窗口 - 执行
java -version和javac -version,两个都成功才说明Path真正生效 - 如果只有
java能用、javac不能用,90%是Path漏加了%JAVA_HOME%\bin,或者加成了%JAVA_HOME%\jre\bin
多个JDK共存时,Path顺序决定默认版本
Windows按Path中路径从上到下的顺序查找可执行文件。谁排前面,java和javac就用谁。
- 不要在
Path里堆砌多个JDK的bin路径——容易混乱且不可控 - 推荐做法:只保留一个
%JAVA_HOME%\bin,通过切换JAVA_HOME值来切换JDK版本 - 若真要并存,把想设为默认的JDK路径放在
Path最顶部(编辑Path时拖拽或剪切粘贴调整顺序) - 注意:某些IDE(如Eclipse)或构建工具(如Maven)会忽略系统
Path,直接读取自己配置的JAVA_HOME,所以这里调的只是命令行默认行为
最容易被忽略的是javac找不到时下意识去重装JDK——其实99%的问题就卡在Path那一条没加对,或者CMD没重启。JDK 21的结构比老版本更干净,反而让旧配置习惯成了最大陷阱。











