要确认系统自带Java是否为OpenJDK,需先检查javac是否存在,再通过readlink -f $(which java)查看路径是否含“openjdk”,并确保java与javac同源。

怎么确认系统自带的 Java 是不是 OpenJDK
很多 Linux 发行版预装了 Java,但默认可能是 JRE(没 javac),也可能是 Oracle JDK(已停更)、或 OpenJDK 但版本太老。直接运行 java -version 和 which java 只能看到“有”,看不到“能不能开发”。关键要看有没有 javac,以及 java 和 javac 是否来自同一套 JDK。
- 运行
javac -version—— 如果报command not found,说明只有 JRE,不能编译代码 - 运行
readlink -f $(which java)—— 看路径里是否含openjdk;比如/usr/lib/jvm/java-17-openjdk-amd64/bin/java就是 OpenJDK 17 - 对比
which java和which javac输出路径的父目录是否一致,不一致说明环境混乱
Ubuntu/Debian 上用 apt 安装 OpenJDK 开发包
别只装 openjdk-17-jre,那是运行时;开发必须装 -jdk 后缀的包,它自带 javac、javadoc、jshell 等全套工具。
- 查可用版本:
apt list -a openjdk-*-jdk(会列出openjdk-17-jdk、openjdk-21-jdk等) - 装 JDK 17(推荐 LTS 版本):
sudo apt install openjdk-17-jdk - 装完验证:
java -version和javac -version输出应一致,且都带openjdk字样 - 注意:Ubuntu 22.04 默认源里没有 OpenJDK 21,要加
ppa:openjdk-r/ppa才能装;但多数项目用 17 更稳
CentOS/RHEL/Rocky Linux 怎么装 OpenJDK 17
RHEL 系发行版默认仓库里的 OpenJDK 版本偏旧(比如 CentOS 7 是 1.8,Rocky 9 自带的是 17,但可能缺 javac),不能只信 yum search java 的结果。
- RHEL 8/9 或 Rocky 9+:
sudo dnf install java-17-openjdk-devel(注意是-devel,不是-headless或-static-libs) - CentOS 7 或 RHEL 7:官方源最老只到 OpenJDK 1.8,必须手动装或换源;推荐用 SDKMAN(见下一条)
- 装完检查:
rpm -ql java-17-openjdk-devel | grep bin/应该列出javac、jar等可执行文件 - 别用
java-17-openjdk-headless—— 它删掉了 AWT/Swing 和编译器,javac直接消失
多个 OpenJDK 版本共存时怎么切版本
装了多个 JDK(比如 11 和 17),java 命令默认走哪个,取决于 update-alternatives 配置或 $PATH 顺序,不是靠改 JAVA_HOME 就能切换的。
立即学习“Java免费学习笔记(深入)”;
- 先看当前生效的:
update-alternatives --config java和update-alternatives --config javac要分别执行,确保两者指向同一版本 - 如果没配置过 alternatives,就手动设
JAVA_HOME:export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java)))),然后加进~/.bashrc - IDE(如 IntelliJ)和构建工具(如 Maven)可能缓存旧的
JAVA_HOME,改完要重启终端、IDE,甚至清~/.m2缓存 - 脚本里别硬编码
/usr/lib/jvm/java-17-openjdk—— 不同发行版路径不同,用$(dirname $(dirname $(readlink -f $(which java))))更可靠
最容易被忽略的是:JDK 包名在不同发行版里差异很大,-jdk、-devel、-headless 这些后缀含义完全不同;装错一个字,javac 就不存在。动手前先 apt list 或 dnf search 确认包名,比事后排查快得多。










