关键在于用 update-alternatives 统一管理 java 和 javac 命令,确保二者版本一致;各 jdk 需分别注册并交互切换,再同步设置匹配的 java_home 以兼容 gradle、tomcat 等工具。

在 Linux 中配置 JDK 环境变量并实现多版本共存与切换,关键不在于“只改 JAVA_HOME”,而在于让 java 和 javac 命令本身可被系统统一调度。单纯靠环境变量切换容易导致命令版本不一致(比如 java -version 是 17,javac -version 却是 8),尤其影响 Maven、IDE 启动的构建进程。
用 update-alternatives 统一管理命令(推荐)
这是 Linux 上最可靠、全局生效的方式,对终端、IDE、CI 工具、systemd 服务都有效。
- 把各 JDK 解压到统一目录,例如:
/usr/lib/jvm/jdk-8u301、/usr/lib/jvm/jdk-11.0.12、/usr/lib/jvm/jdk-17.0.3 - 为每个 JDK 的
java和javac分别注册(数字为优先级,越大默认越靠前):sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-8u301/bin/java 100sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-11.0.12/bin/java 200sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-17.0.3/bin/java 300sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk-8u301/bin/javac 100sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk-11.0.12/bin/javac 200sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk-17.0.3/bin/javac 300 - 交互式切换:
sudo update-alternatives --config java和sudo update-alternatives --config javac,选编号即可 - 验证一致性:
java -version和javac -version输出必须完全相同
配合环境变量提供 JAVA_HOME 参考值
虽然 update-alternatives 不依赖 JAVA_HOME,但很多工具(如 Gradle、Tomcat)仍会读取它。建议设置一个与当前 active 版本匹配的 JAVA_HOME。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 编辑
/etc/profile.d/java.sh(系统级)或~/.bashrc(用户级) - 添加内容(以 JDK 17 为例):
export JAVA_HOME=/usr/lib/jvm/jdk-17.0.3export PATH=$JAVA_HOME/bin:$PATH - 注意:PATH 中的 $JAVA_HOME/bin 不影响命令选择顺序(由 alternatives 决定),仅作为备用路径或兼容旧脚本
使用包管理器安装 OpenJDK(适合标准版本)
如果只需主流 LTS 版本(如 8/11/17/21),直接用 apt 或 dnf 安装更省心,它们已预注册到 alternatives。
- Ubuntu/Debian:
sudo apt install openjdk-11-jdk openjdk-17-jdk - RHEL/CentOS/Fedora:
sudo dnf install java-11-openjdk-devel java-17-openjdk-devel - 安装后自动注册,运行
sudo alternatives --config java即可切换 - 路径通常为:
/usr/lib/jvm/java-11-openjdk-amd64/或/usr/lib/jvm/java-17-openjdk/
避免常见错误
这些操作看似简单,却最容易引发版本混乱:
- 只改 JAVA_HOME 而不注册 alternatives → java 和 javac 可能指向不同 JDK
- 在 PATH 中硬编码多个 JDK/bin → 命令优先级取决于顺序,难维护且易冲突
- 用
export JAVA_HOME=...临时设置 → 新开终端或 IDE 启动时不生效 - 未同步更新 javac → 构建时用旧编译器,运行时用新 JVM,导致 class 文件版本不兼容
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










