必须完全一致:执行which java和which javac,返回路径须同属一个JDK的bin目录;readlink -f展开后父目录须相同;$JAVA_HOME/bin/java -version与$JAVA_HOME/bin/javac -version须均成功且版本号完全一致。

which javac 和 which java 输出路径必须完全一致
执行 which java 和 which javac,看返回的完整路径是否指向同一个 bin 目录。例如两者都应是:
/usr/lib/jvm/java-17-openjdk-amd64/bin/java/usr/lib/jvm/java-17-openjdk-amd64/bin/javac
如果一个是 /usr/bin/java、另一个是 /usr/lib/jvm/jdk-17.0.2/bin/javac,说明 PATH 中混入了系统默认软链接或旧版本,实际调用来源不同。
常见干扰路径包括:/usr/bin(Ubuntu/Debian 的 update-alternatives 伪装路径)、/Library/Java/JavaVirtualMachines/xxx.jdk/Contents/Home/jre/bin(macOS 错误指向 JRE)、C:\Windows\System32\java.exe(Windows 系统级代理)。
readlink -f $(which java) 和 readlink -f $(which javac) 必须指向同一 JDK 根目录
readlink -f 能展开所有软链接,暴露出真实物理路径。执行:
立即学习“Java免费学习笔记(深入)”;
readlink -f $(which java)readlink -f $(which javac)
二者输出的父目录(即去掉最后两级 /bin/java 或 /bin/javac 后的部分)必须完全相同。比如都应是:/usr/lib/jvm/java-17-openjdk-amd64。
若不一致,说明即使 which 显示路径相似,底层仍是不同安装包——比如 OpenJDK 17 的 JRE 和 JDK-devel 分开安装时,java 可能来自 java-17-openjdk 包,而 javac 来自 java-17-openjdk-devel,但它们的安装根目录可能因打包策略不同而略有差异。
$JAVA_HOME/bin/java -version 和 $JAVA_HOME/bin/javac -version 必须能运行且版本号一致
绕过 PATH 搜索,直接用 JAVA_HOME 定位调用:
$JAVA_HOME/bin/java -version$JAVA_HOME/bin/javac -version
这两个命令必须:
- 都能成功执行(不能报
command not found或No such file or directory) - 输出的版本号完全一致(包括小版本和构建号,如
17.0.2,不是只看17) - 且与裸调
java -version和javac -version输出一致
如果 $JAVA_HOME/bin/javac 报错,但 javac -version 能跑,说明 JAVA_HOME 指向错误(比如指向了 JRE、bin 子目录,或根本没装 devel 包)。
Linux/macOS 上还要检查 update-alternatives 或 jenv 是否干扰
Ubuntu/Debian 默认用 update-alternatives 管理多版本 Java,它可能把 java 和 javac 分别注册为不同链路:
sudo update-alternatives --config javasudo update-alternatives --config javac
这两条命令的当前选中项必须指向同一安装路径。否则即使你手动改了 PATH,系统级替代机制仍会覆盖。
macOS 用户若用了 jenv,需确认:jenv versions 列出的版本是否包含 javac,以及 jenv shell 17 后再执行 which java 和 which javac 是否同步生效——jenv 不自动绑定 javac,需显式 jenv enable-plugin export 并重载配置。
最易被忽略的是:PATH 正确、JAVA_HOME 正确、which 看似一致,但 update-alternatives 或 jenv 在后台悄悄做了分流。验证必须落到真实二进制路径和 readlink -f 展开结果上。



















