jdk未安装或环境变量未生效需先验证:运行java -version和which java判断是否安装及路径,readlink -f $(which java)确认真实路径;java_home须指向含bin/lib/jre的根目录,配置文件选/etc/profile(全局)或~/.bashrc(个人),等号无空格,修改后必须source生效。

java: command not found 或 JAVA_HOME is not set 这类错误,说明系统里压根没装 JDK,或者装了但环境变量根本没生效。别折腾配置文件前先确认这点。
怎么判断 JDK 真的没装,还是只缺环境变量
运行这两条命令:
-
java -version—— 如果报command not found,大概率没装;如果输出版本但不是你想要的(比如 1.8 而你需 17),说明有旧版本残留 -
which java—— 输出空?没装或 PATH 没导对;输出/usr/bin/java?那很可能是包管理器装的 OpenJDK,路径在/usr/lib/jvm/下
再补一句:readlink -f $(which java) 能看到真实路径,比如 /usr/lib/jvm/java-17-openjdk-amd64/bin/java,那 JAVA_HOME 就该设成 /usr/lib/jvm/java-17-openjdk-amd64,而不是它里面的 bin 目录。
/etc/profile vs ~/.bashrc:该改哪个文件
关键看你要谁用这个 Java:
- 所有用户(包括 systemd 服务、crontab、其他登录用户)都得用 → 改
/etc/profile或更规范地新建/etc/profile.d/java.sh - 只给自己用,且可能频繁切换 JDK 版本 → 改
~/.bashrc(注意:Zsh 用户要改~/.zshrc) - 千万别碰
/etc/environment—— 它不支持$JAVA_HOME这种变量展开,写了也白写
改完必须 source /etc/profile 或 source ~/.bashrc,否则新开终端照样不认。别信“保存就自动生效”。
手动解压 JDK 后,JAVA_HOME 路径怎么写才对
常见错误是把路径写成 /opt/jdk-17.0.1/bin 或 /opt/jdk-17.0.1/jre,这直接导致 javac 找不到、Tomcat 启动失败。
-
JAVA_HOME必须指向解压后那个**含bin/、lib/、jre/子目录的根目录**,例如/opt/jdk-17.0.1 - 路径里不能有软链接嵌套(比如
/opt/jdk → /usr/lib/jvm/jdk-17.0.1),某些 JVM 启动脚本会解析真实路径,软链可能触发权限拒绝 - 别放
/root/或~/jdk下 —— 切换用户或sudo -i后就访问不了 - 推荐固定位置:
/usr/local/jdk或/opt/jdk,权限统一、路径稳定
写进配置文件时,等号两边**绝对不能有空格**:export JAVA_HOME=/opt/jdk-17.0.1 ✅,export JAVA_HOME = /opt/jdk-17.0.1 ❌(会当成赋值给变量 JAVA_HOME ,带空格)。
CLASSPATH 还需要配吗
JDK 8 之后,dt.jar 和 tools.jar 已被移除,CLASSPATH 对绝大多数场景已非必需。保留它无害,但写错了反而容易埋坑:
- 如果用了 JDK 9+,
$JAVA_HOME/lib/dt.jar根本不存在,java -cp命令可能静默忽略或报错 - 现代构建工具(Maven、Gradle)和 IDE 自己管 classpath,手动设反而干扰
- 真要配,优先用
-cp参数临时指定,而不是全局污染CLASSPATH
所以现在最干净的做法是只设两行:export JAVA_HOME=... 和 export PATH=$JAVA_HOME/bin:$PATH。够用,少出错。
JAVA_HOME 指向哪里、写进哪个文件、是否带空格、要不要 reload —— 这四点错一个,java -version 就可能成功但 javac 失败,或者当前终端能用、脚本里就崩。别跳步骤。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











