在 CentOS 上配置 Java 环境变量后“失效”,通常不是 Java 本身的问题,而是环境变量没有被正确加载或作用范围不对。下面按最常见原因逐一说明。
不同文件作用范围不同:
| 文件 | 作用范围 |
|---|---|
/etc/profile |
所有用户(登录 shell) |
/etc/bashrc |
所有用户(非登录 shell) |
~/.bash_profile |
当前用户(登录 shell) |
~/.bashrc |
当前用户(非登录 shell) |
❌ 常见错误:
.bash_profile,却用 su 而不是 su -.bashrc,但用的是登录 shell✅ 推荐做法(通用):
vi ~/.bashrc
末尾加:
export JAVA_HOME=/usr/java/jdk1.8.0_361
export PATH=$JAVA_HOME/bin:$PATH
然后:
source ~/.bashrc
source改完文件不生效是正常的:
source /etc/profile
# 或
source ~/.bashrc
否则只在新开终端才生效。
su 而不是 su -su
❌ 不会加载 /etc/profile
su -
✅ 会加载完整环境变量
CentOS 常自带 OpenJDK:
which java
如果指向:
/usr/bin/java
检查:
ls -l /usr/bin/java
设置默认:
alternatives --config java
或强制前置 PATH:
export PATH=$JAVA_HOME/bin:$PATH
检查:
echo $JAVA_HOME
ls $JAVA_HOME/bin/java
常见错误:
如果你在 服务里跑 Java:
systemctl start myapp
❌ 不会读取 .bashrc
✅ 正确方式:
[Service]
Environment=JAVA_HOME=/usr/java/jdk1.8.0_361
Environment=PATH=/usr/java/jdk1.8.0_361/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
或:
systemctl edit myapp
如用的是 sh、zsh:
echo $SHELL
对应改:
zsh → ~/.zshrcsh → 基本不读 bash 文件echo $JAVA_HOME
which java
java -version
如果:
JAVA_HOME 为空 → 没加载which java 不是你设置的 → PATH 被覆盖# /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_361
export PATH=$JAVA_HOME/bin:$PATH
chmod +x /etc/profile.d/java.sh
source /etc/profile
✅ 所有用户、所有 shell 都生效
如果你愿意,可以贴出:
我可以直接帮你定位是哪一条导致的失效。