最稳方案是用系统包管理器安装openjdk-17-jdk(Ubuntu/Debian)或java-17-openjdk-devel(RHEL/CentOS 8+),避免default-jdk版本不一致及缺失javac的问题,且无需手动配置JAVA_HOME;RHEL系需在工具报错时才补设JAVA_HOME。

直接用系统包管理器装 openjdk-17-jdk(Ubuntu/Debian)或 java-17-openjdk-devel(RHEL/CentOS 8+),别下 tar.gz、别手动配 JAVA_HOME,90% 的场景下最稳、最省事。
为什么 apt install default-jdk 经常出问题
它在不同 Ubuntu 版本里指向的 JDK 小版本不一致:20.04 默认是 OpenJDK 11,22.04 是 17,24.04 可能是 21。更麻烦的是,default-jdk 只保证有 java,但不保证带 javac——实际依赖 default-jre 和 default-jdk-headless 的组合,容易漏掉编译器。
- 现象:
java -version能输出,但javac -version报command not found - 原因:只装了 JRE 或 headless JDK,没装完整开发包
- 解法:明确指定版本安装,例如
sudo apt install openjdk-17-jdk,这个包一定含javac和javadoc等全套工具
openjdk-17-jdk 和 java-17-openjdk-devel 的路径与环境变量差异
两者功能等价,都是完整 JDK,但安装后默认路径和环境变量处理方式不同:
- Ubuntu/Debian:
openjdk-17-jdk装到/usr/lib/jvm/java-17-openjdk-amd64/,自动注册进update-alternatives,/usr/bin/java指向它 - RHEL/CentOS 8+:
java-17-openjdk-devel装到类似/usr/lib/jvm/java-17-openjdk-17.0.2.0.8-2.el9_4.x86_64/(路径含具体小版本号),/usr/bin/java同样可用,但JAVA_HOME不自动设 - 关键区别:RHEL 系默认不写
JAVA_HOME,遇到 Maven、Gradle 或 Jenkins 报JAVA_HOME not set时才需要补一句:export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
什么时候才该手动解压 tar.gz
只有当你必须锁定某个特定小版本(比如项目文档明确要求 jdk-17.0.12+7),而系统仓库只提供 17.0.11+9 时,才值得手动操作。
- 下载地址认准 Eclipse Temurin:
https://github.com/adoptium/temurin17-binaries/releases(非 Oracle 官网) - 解压后验证第一件事:运行
/path/to/jdk-17.0.12+7/bin/java -version,确认能执行再配环境变量 - 配环境变量优先写进
/etc/profile.d/java.sh(全局)或~/.bashrc(当前用户),内容为:export JAVA_HOME=/opt/jdk-17.0.12+7和export PATH=$JAVA_HOME/bin:$PATH - 别用软链伪装路径(如
/opt/java → jdk-17.0.12+7),升级时容易漏掉更新软链,导致java -version和实际JAVA_HOME不一致
最容易被忽略的是:装完必须同时验证 java -version 和 javac -version 都能正常输出,且路径一致;RHEL/CentOS 用户尤其要注意 JAVA_HOME 是空的,不是“没装好”,而是默认就不设。











