在 Linux 服务器上排查 Java 环境时,经常遇到一种情况:同一个服务器,用 Xshell 登录后执行 `java -version` 可以正常显示版本号,但换到 Electerm 或其他终端工具里,却提示 `Command 'java' not found`。
其实这并不是 Java 没有安装,也不是服务器环境出了问题,而是不同终端工具在建立 SSH 连接时,加载的 Shell 配置文件不同,导致环境变量没有生效。
问题原因
Linux 中常见的环境变量配置文件有: ● ~/.bashrc ● ~/.bash_profile ● ~/.profile ● /etc/profile ● /etc/profile.d/
不同终端工具连接服务器时,可能会以不同方式启动 Shell。有些终端会加载登录 Shell 配置,有些则只加载交互式非登录 Shell 配置。
如果 Java 环境变量只写在
~/.bashrc 里,那么某些终端工具登录后可能不会自动读取这个文件,于是就会出现:echo $JAVA_HOME
能看到值,但执行:
java -version
仍然提示找不到命令。
典型表现就是:
JAVA_HOME=/home/jdk/jdk1.8.0_181 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
虽然
JAVA_HOME 已经存在,但 PATH 中并没有:/home/jdk/jdk1.8.0_181/bin
解决方法
最稳妥的做法是把 Java 环境变量放到
/etc/profile.d/ 目录下,这样大多数终端、脚本和后台服务都能更容易读取到。创建配置文件:
sudo vi /etc/profile.d/java.sh
写入以下内容:
export JAVA_HOME=/home/jdk/jdk1.8.0_181 export PATH=$JAVA_HOME/bin:$PATH
保存后执行:
source /etc/profile.d/java.sh
然后重新打开 Electerm 会话,执行:
java -version
如果正常显示版本号,说明问题已经解决。
临时解决办法
如果暂时不想修改系统配置,也可以在当前会话中手动加载环境变量:
source /etc/profile java -version
或者直接使用 Java 的绝对路径运行:
/home/jdk/jdk1.8.0_181/bin/java -version
启动 jar 包时也可以写成:
nohup /home/jdk/jdk1.8.0_181/bin/java -jar blog.jar > blog.log 2>&1 &