javac command not found 是因为只安装了JRE而非JDK;Linux发行版默认安装的openjdk包(如java-17-openjdk)仅含运行时环境,需额外安装-devel(RHEL系)或-jdk(Debian/Ubuntu)包才能获得javac编译器。

javac command not found 是因为只装了 JRE,不是 JDK
Linux 发行版(包括 openEuler、Ubuntu、CentOS 等)的软件包管理器默认安装的是 java-<version>-openjdk</version>,这个包只含 JRE —— 它能运行 java,但不带 javac。你执行 java -version 成功,不代表开发环境就绪。
验证方法很简单:
- 运行
which javac:无输出或报错,说明命令根本不存在 - 运行
dnf list installed | grep openjdk(openEuler/RHEL)或apt list --installed | grep openjdk(Ubuntu/Debian):如果只看到java-17-openjdk这类名字,没有-devel后缀,就是问题所在 - 检查
/usr/lib/jvm/下对应 JDK 目录里有没有bin/javac:比如ls /usr/lib/jvm/java-17-openjdk-amd64/bin/javac,若提示 “No such file”,确认是 JRE 包
该装哪个包:-devel 才是关键后缀
不同发行版的 JDK 开发包命名规则一致:必须带 -devel(RHEL 系衍生)或 -jdk(Debian/Ubuntu),否则不含编译器。
实操命令如下:
立即学习“Java免费学习笔记(深入)”;
- openEuler / CentOS / Rocky Linux:
sudo dnf install java-17-openjdk-devel - Ubuntu / Debian:
sudo apt install openjdk-17-jdk(注意是-jdk,不是-jre) - Arch Linux:
sudo pacman -S jdk-openjdk
装完再跑 javac -version,应该立刻返回版本号。不用改环境变量——这些包会把 javac 符号链接自动放到 /usr/bin/ 下,系统 PATH 默认已包含该路径。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
PATH 没问题,但 javac 还是找不到?检查是否被覆盖
即使装对了 -devel 包,仍可能因 PATH 顺序或残留配置导致 javac 不生效。常见干扰点:
-
which java和which javac返回路径不一致:说明 PATH 中多个 Java 目录混杂,可能某个旧的/usr/bin/java指向 JRE,而javac在另一个 JDK 的bin下但排在后面 - 手动设过
JAVA_HOME且指向了 JRE 目录(如/usr/lib/jvm/java-17-openjdk-amd64-jre):这会让%JAVA_HOME%\bin或$JAVA_HOME/bin加入 PATH,但该目录下根本没有javac - Shell 配置文件(
~/.bashrc、~/.zshrc)里硬编码了错误的 PATH,盖过了系统包自动注册的路径
临时排查:运行 export PATH="/usr/bin:$PATH" 再试 javac -version。如果成了,说明你的 PATH 被污染,需要清理掉冗余的 JAVA_HOME 或重复的 bin 路径。
Windows/macOS 用户别跳过 JDK 安装步骤
Windows 和 macOS 用户容易忽略一点:官网下载的 OpenJDK 安装包(如 jdk-17.0.8+7)本身已是完整 JDK,自带 javac。但如果你用的是系统自带的 java(如 macOS 的 /usr/bin/java),它大概率只是 JRE —— 苹果早已不预装 JDK。
所以请确认:
- Windows:安装的是
jdk-*.exe,不是jre-*.exe;安装后检查C:\Program Files\Java\jdk-17.0.8\bin\javac.exe是否存在 - macOS:用
brew install openjdk@17,然后运行sudo ln -sfn /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk,再验证javac -version - 所有平台:避免用包管理器(如
scoop、choco、homebrew)安装openjdk时不加版本和后缀,比如brew install openjdk可能装最新版但不保证符号链接正确,建议明确写brew install openjdk@21
最常被忽略的细节是:JDK 和 JRE 在包管理层面是两个独立实体,名字差一个后缀,功能却天壤之别。装错包,PATH 再对也白搭。


















