优先用包管理器安装openjdk,ubuntu/debian执行sudo apt install openjdk-17-jdk,centos/rhel 8+执行sudo dnf install java-17-openjdk-devel;仅当需特定小版本或oracle jdk时才手动解压配置。

直接说结论:优先用包管理器安装,除非你明确需要某个特定小版本(比如 jdk-8u411),或者必须用 Oracle JDK 商业版。手动解压配置不仅容易出错,后续升级、多版本切换也麻烦。
Ubuntu/Debian 上用 apt 安装 OpenJDK
这是最省心的方式,系统自动注册 update-alternatives,java 和 javac 命令开箱即用。
- 装 JDK 17(推荐新项目):
sudo apt update && sudo apt install -y openjdk-17-jdk - 装 JDK 11(LTS,生产环境稳妥选择):
sudo apt install -y openjdk-11-jdk - 装 JDK 8(老系统维护):
sudo apt install -y openjdk-8-jdk,如果提示找不到包,先加源:sudo add-apt-repository ppa:openjdk-r/ppa -y && sudo apt update - 验证:
java -version和javac -version应该都返回版本信息,且路径指向/usr/lib/jvm/下的子目录
CentOS/RHEL/Rocky 上用 dnf/yum 安装
注意:RHEL 8+ / CentOS 8+ 默认用 dnf;7 及更早用 yum。装 -devel 包才包含 javac,只装 java-xx-openjdk 是运行时,不能编译。
OpenJDK 24 Windows x64 官方参考实现(24+36),适合 Windows 环境进行 Java 开发、编译、运行和版本兼容性验证。
- 查可用版本:
dnf search openjdk或yum list available | grep jdk - 装 JDK 17:
sudo dnf install -y java-17-openjdk-devel - 装 JDK 11:
sudo dnf install -y java-11-openjdk-devel - 如果提示找不到包,可能需启用 CRB 仓库(CentOS/RHEL 8+):
sudo dnf config-manager --set-enabled crb - 验证后,
which java返回的是/usr/bin/java,它是个符号链接,实际由alternatives管理
手动解压安装(仅当必须时)
常见于离线环境、要精确控制安装路径、或使用 Oracle JDK。但你要自己管 JAVA_HOME、PATH、权限、以及后续所有版本切换。
- 解压到统一位置,比如
/usr/local/java/jdk-17.0.2,别放/home下——普通用户目录对系统服务不可见 - 写环境变量时,
JAVA_HOME必须是解压后的**完整路径**,不是压缩包名;export PATH=$JAVA_HOME/bin:$PATH才能让java命令生效 - 别漏掉
source /etc/profile或source ~/.bashrc,否则当前终端不认新配置 - 手动安装后,
update-alternatives --config java不会列出它,你得自己注册(不推荐) - 错误现象:执行
java -version显示 “command not found”,大概率是PATH没加对,或source没执行
JAVA_HOME 怎么设才真正有效
JAVA_HOME 不只是给开发者看的,Maven、Gradle、Tomcat、Spring Boot 都依赖它。设错会导致构建失败或启动报 NoClassDefFoundError。
- 包管理器安装后,
JAVA_HOME通常没自动设——虽然java能用,但工具链可能找不到 JDK 根目录 - 正确做法:查真实路径
readlink -f $(which java),然后向上推两级,比如输出/usr/lib/jvm/java-17-openjdk-amd64/bin/java,那JAVA_HOME就是/usr/lib/jvm/java-17-openjdk-amd64 - 设到全局:
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' | sudo tee /etc/profile.d/java.sh,再source /etc/profile.d/java.sh - 验证:
echo $JAVA_HOME应输出路径,且$JAVA_HOME/bin/java -version必须能跑通
最容易被忽略的一点:不同工具对 JAVA_HOME 的敏感度不同。IDEA 或 VS Code 可能用自己的 JDK,但 CI 脚本、systemd 服务、Docker 构建过程全靠这个环境变量。设错一次,排查半天。










