java环境变量配置错误导致java -version报command not found,需将jdk解压至/opt/java并配置/etc/profile.d/java.sh,确保java_home、path正确,且systemd服务需显式指定java_home。

Java环境变量配不对,java -version 就永远报 command not found,哪怕JDK明明解压好了。
确认JDK安装路径和版本类型
CentOS 7 默认不带JDK,得自己装。别直接 yum install java —— 那装的是 OpenJDK JRE,没 javac,也不适合企业部署。企业级场景必须用 JDK(带开发工具),推荐 Oracle JDK 或 OpenJDK 8/11 LTS 版本,从官网下 tar.gz 包手动解压。
解压后路径别放在 /root 或用户家目录下,企业环境统一放 /usr/local/java 或 /opt/java。比如:
sudo tar -zxf jdk-8u291-linux-x64.tar.gz -C /opt/ sudo ln -s /opt/jdk1.8.0_291 /opt/java
这样后续升级只要改软链,不用动环境变量。
立即学习“Java免费学习笔记(深入)”;
- 用
ls -l /opt/java确认软链指向真实目录 - 检查
/opt/java/bin/java是否可执行:ls -l /opt/java/bin/java - 别用
rpm安装的 JDK 路径(如/usr/java/jdk1.8.0_291-amd64),它会自建/etc/profile.d/java.sh,和你手配的冲突
写进 /etc/profile 还是 /etc/profile.d/?
企业服务器多用户共用,必须全局生效,所以不能只配 ~/.bashrc。但直接改 /etc/profile 不利于维护,/etc/profile.d/ 才是正解 —— 系统启动时会自动 source 该目录下所有 .sh 文件。
创建 /etc/profile.d/java.sh,内容严格按顺序写:
export JAVA_HOME=/opt/java export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
注意三点:
-
JAVA_HOME必须指向 JDK 根目录(不是bin),否则 Maven、Tomcat 会找不到tools.jar -
PATH中$JAVA_HOME/bin必须在系统PATH前面,否则可能调到旧版java -
CLASSPATH企业项目一般不用设,除非老应用依赖dt.jar;新项目(Spring Boot 等)设了反而可能出类加载冲突
source /etc/profile 不生效?查这三件事
执行 source /etc/profile 后,echo $JAVA_HOME 为空或错,常见原因就三个:
- 文件权限不对:
/etc/profile.d/java.sh必须是644,且不能有.bash或其他后缀(只能是.sh) - Shell 类型不符:如果用户默认是
zsh或dash,/etc/profile不会被读取;企业环境统一用bash,检查echo $SHELL - 语法错误:
export行末尾不能有多余空格,等号两侧不能有空格,比如export JAVA_HOME = /opt/java是错的
验证是否生效最准的方式是开新终端,再跑:java -version 和 javac -version。只跑一个不保险 —— 有些环境 java 是软链到 jre/bin,但 javac 才真正检验 JDK 是否到位。
Tomcat / Jenkins 等服务起不来?它们不读 /etc/profile
systemd 服务(如 tomcat.service)默认不加载 shell profile,所以即使终端里 java -version 正常,Tomcat 日志里仍可能报 Cannot find JAVA_HOME。
解决方法只有两个:
- 在 service 文件里显式指定:
Environment="JAVA_HOME=/opt/java" - 或者改用
ExecStart全路径:ExecStart=/opt/java/bin/java -jar ...
别信“重启系统就自动加载”—— systemd 的环境隔离很彻底,profile 文件对它完全透明。这点在上线前必须验证,否则半夜重启 Tomcat 就挂。
企业环境里,JDK 路径、环境变量、服务配置三者必须一致,差一个字符都可能让整套 CI/CD 卡在编译阶段。配完别只测命令行,一定要拉个最简 Spring Boot jar 跑通再收工。










