javac命令不存在的根本原因是未安装JDK而仅安装了JRE;Linux发行版默认常装default-jre或openjdk--jre,不含javac编译器,需改装default-jdk或openjdk--jdk并确保JAVA_HOME与PATH指向同一JDK目录。

javac 命令不存在,不是配置漏了,而是根本没装 JDK —— 只装 JRE 的系统连编译器都没有。
javac: command not found 是什么信号
这个错误不是路径配错了,是系统里压根没放 javac。Linux 发行版(尤其是 Ubuntu/Debian)默认安装的 default-jre 或 openjdk-17-jre 只含运行环境,不含开发工具。你执行 java -version 能成功,但 javac -version 必然失败。
- 运行
ls /usr/lib/jvm/,如果只看到java-17-openjdk-amd64这类名字、且目录下没有bin/javac,说明它只是 JRE 包(常见于-jre后缀或未带-devel的包) - 用
dpkg -l | grep jdk(Debian/Ubuntu)或rpm -qa | grep java(RHEL/CentOS)查已安装包,确认是否含-jdk或-devel字样 - 别信
which java的结果——它可能指向/usr/bin/java,而这个是系统级符号链接,背后可能是 JRE 伪装的 JDK
用 apt 安装 JDK 要选对包名
Ubuntu/Debian 系用户最容易踩的坑:只装 default-jre,却以为“default”就等于“全功能”。default-jdk 才是真正带 javac 的元包。
- 先更新索引:
sudo apt update - 装开发套件:
sudo apt install default-jdk(自动拉取最新 LTS 版,如 OpenJDK 17) - 验证:
javac -version和java -version输出版本号必须一致;再检查ls $(dirname $(readlink -f $(which javac)))/../lib,应能看到tools.jar(JDK 标志物) - 如果必须指定版本(比如要 JDK 11),用
sudo apt install openjdk-11-jdk,而非openjdk-11-jre
JAVA_HOME 和 PATH 必须指向同一物理目录
即使装了 JDK,javac 和 java 仍可能调用不同版本——PATH 里混进了系统自带的旧命令,或 JAVA_HOME 指向一个空壳路径。
立即学习“Java免费学习笔记(深入)”;
- 执行
which javac和which java,看两个路径是否都落在$JAVA_HOME/bin下(例如都是/usr/lib/jvm/java-17-openjdk-amd64/bin/javac) - 检查
echo $JAVA_HOME输出是否真实存在,且该目录下有bin/javac和lib/tools.jar - 确保
$JAVA_HOME/bin在 PATH 最前面:export PATH=$JAVA_HOME/bin:$PATH,不能写成export PATH=$PATH:$JAVA_HOME/bin - 改完
~/.bashrc或~/.zshrc后,必须source ~/.zshrc(或新开终端),否则变量不生效
手动解压 JDK 时路径容易错两处
从官网下载 tar.gz 包解压,是最灵活也最易出错的方式。关键不在解压动作本身,而在后续路径引用是否精准。
-
JAVA_HOME必须指向解压后的**最内层 JDK 目录**,比如解压到/usr/local/java,得到/usr/local/java/jdk-17.0.2,那JAVA_HOME就是/usr/local/java/jdk-17.0.2,不是/usr/local/java - 别在
/etc/environment里写JAVA_HOME="/usr/local/java/jdk-17.0.2/"(末尾斜杠)——某些 shell 会把它当无效路径忽略 - 验证方式最直接:
ls $JAVA_HOME/bin/javac必须返回文件路径,$JAVA_HOME/bin/javac -version必须输出版本号 - 如果用
alternatives管理多版本,记得运行sudo alternatives --config java和sudo alternatives --config javac并选同一个条目
真正卡住人的从来不是“怎么装”,而是装完后没意识到 javac 和 java 可能来自两个不同安装树——哪怕它们版本号看起来一样。


















