/etc/environment不适合配置JAVA_HOME,因其由PAM读取、不经过shell解析,无法展开$JAVA_HOME/bin,导致PATH未更新、javac和Maven等工具不可用;应改用支持shell语法的/etc/profile,添加export JAVA_HOME=...和export PATH=$JAVA_HOME/bin:$PATH。

直接改 /etc/environment 会失效,因为不支持 $JAVA_HOME/bin 展开;真正生效且兼容 Maven/Gradle 的方式是改 /etc/profile。
为什么 /etc/environment 不适合 JAVA_HOME
它由 PAM 在登录时读取,不经过 shell 解析,所以以下写法全部无效:
-
JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"—— 值能存住,但PATH不会自动追加bin -
PATH="$JAVA_HOME/bin:$PATH"—— 语法报错或被忽略 -
export JAVA_HOME——export是 shell 内建命令,这里根本不执行
结果就是 java -version 成功,但 javac -version 或 mvn compile 报 “command not found”。
正确做法:用 /etc/profile 全局配置
所有登录 shell(SSH、图形终端启动的 bash/zsh)都会 source 它,支持完整 shell 语法:
- 用 root 权限编辑:
sudo nano /etc/profile - 在文件末尾添加两行(路径必须真实存在,且含
bin/java和bin/javac):export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH
- 保存后,新开终端即生效;已有终端运行:
source /etc/profile
注意:CLASSPATH 一般不用设——现代构建工具(Maven/Gradle)和应用服务器都自行管理类路径,硬配反而容易冲突。
怎么确认 JDK 路径是对的
90% 的配置失败,根源是路径写错了。别猜,用命令推:
- 先查
java实际位置:readlink -f $(which java) - 输出类似
/usr/lib/jvm/java-17-openjdk-amd64/bin/java,往上切两级:/usr/lib/jvm/java-17-openjdk-amd64 - 验证该目录下有:
ls $JAVA_HOME/bin/java $JAVA_HOME/bin/javac - Debian/Ubuntu 架构后缀常为
amd64或arm64;RHEL/CentOS 通常无后缀,路径更短
手动解压的 JDK(如 /opt/jdk-17.0.2),务必确认解压后目录结构完整,bin 和 lib 都得有。
验证必须连着跑两步
只看 echo $JAVA_HOME 没用,PATH 才决定命令能否调用:
-
echo $JAVA_HOME→ 确认变量值 -
javac -version→ 真正检验PATH是否连上了bin
如果第二步失败,说明要么路径不对,要么 PATH 没更新成功——这时候回看 /etc/profile 里那行 export PATH=... 有没有拼错、有没有漏掉 $JAVA_HOME/bin。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











