概览
在 Ubuntu 上管理多个 Java 版本,常用做法有三类:系统自带的 update-alternatives、面向 JVM 生态的 SDKMAN!、以及多版本切换器 jenv。它们分别适合系统级统一切换、开发者按版本安装与切换、以及项目级与 Shell 级的多版本管理。
方案一 update-alternatives 系统级管理
- 安装多个 OpenJDK(示例为 OpenJDK 11 与 OpenJDK 17):
- sudo apt update
- sudo apt install openjdk-11-jdk openjdk-17-jdk
- 将各版本加入 alternatives(路径因架构可能为 amd64 或 arm64):
- sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1
- sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 2
- 交互式选择默认版本:
- sudo update-alternatives --config java
- 验证:
- 说明:该方式由系统统一管理,适合服务器或需要统一全局默认的场景。
方案二 SDKMAN! 开发者友好
- 安装与初始化:
- curl -s “https://get.sdkman.io” | bash
- source “$HOME/.sdkman/bin/sdkman-init.sh”
- 常用命令:
- 查看可用版本:sdk list java
- 安装指定版本:sdk install java 11.0.11-open
- 当前会话使用:sdk use java 8.0.292-open
- 设置默认版本:sdk default java 11.0.11-open
- 卸载:sdk uninstall java 11.0.11-open
- 说明:SDKMAN! 可在用户空间下载并管理多个 JDK 与 Maven/Gradle 等 JVM 工具,适合开发与测试多版本并行。
方案三 jenv 多版本与项目级管理
- 安装与初始化:
- sudo apt update && sudo apt install git curl
- git clone https://github.com/jenv/jenv.git ~/.jenv
- echo ‘export PATH=“$HOME/.jenv/bin:$PATH”’ >> ~/.bashrc
- echo ‘eval “$(jenv init -)”’ >> ~/.bashrc
- source ~/.bashrc
- 添加已安装的 JDK(路径以实际为准):
- jenv add /usr/lib/jvm/java-11-openjdk-amd64
- jenv add /usr/lib/jvm/java-8-openjdk-amd64
- 常用命令:
- 列出版本:jenv versions
- 全局版本:jenv global 11.0
- 当前会话:jenv shell 8.0
- 当前目录:jenv local 17.0
- 说明:jenv 提供全局、会话与目录级的多版本控制,便于在同一机器上按项目切换 JDK。
如何选择与常见问题
- 选择建议:
- 需要在系统层面统一默认版本:优先用 update-alternatives。
- 需要在用户空间安装/切换多个 JDK 及构建工具:优先用 SDKMAN!。
- 需要按项目或目录自动切换、并配合 Shell:优先用 jenv。
- 常见问题与排查:
- 版本冲突与环境变量错乱:统一使用上述工具进行切换,避免多处手动改 JAVA_HOME;必要时在 ~/.bashrc 或 /etc/environment 中仅保留一处正确设置并 source 使其生效。
- 仅切换 java 命令仍不够:如需构建工具生效,确保 JAVA_HOME 与 PATH 指向同一 JDK(SDKMAN! 与 jenv 均可帮助设置)。
- 查看与清理:
- 列出系统已注册版本:update-alternatives --config java
- 移除不需要的 JDK:sudo apt-get remove openjdk-
- 验证当前生效版本:java -version。