在 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 里,那么某些终端工具登录后可能不会自动读取这个文件,于是就会出现:
bash
echo $JAVA_HOME
能看到值,但执行:
java -version
仍然提示找不到命令。
典型表现就是:
ruby
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 中并没有:
bash
/home/jdk/jdk1.8.0_181/bin
所以系统找不到 java 命令。
解决方法
最稳妥的做法是把 Java 环境变量放到 /etc/profile.d/ 目录下,这样大多数终端、脚本和后台服务都能更容易读取到。
创建配置文件:
bash
sudo vi /etc/profile.d/java.sh
写入以下内容:
bash
export JAVA_HOME=/home/jdk/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
保存后执行:
bash
source /etc/profile.d/java.sh
然后重新打开 Electerm 会话,执行:
java -version
如果正常显示版本号,说明问题已经解决。
临时解决办法
如果暂时不想修改系统配置,也可以在当前会话中手动加载环境变量:
bash
source /etc/profile
java -version
或者直接使用 Java 的绝对路径运行:
bash
/home/jdk/jdk1.8.0_181/bin/java -version
启动 jar 包时也可以写成:
bash
nohup /home/jdk/jdk1.8.0_181/bin/java -jar blog.jar > blog.log 2>&1 &