在Ubuntu系统上管理Ja va版本,几乎是每个开发者都会遇到的场景。不同项目依赖不同JDK,来回切换如果全靠手工捣鼓路径,既容易出错也浪费时间。下面这套操作流程,涵盖了从安装、切换到环境变量配置的完整路径,同时也整理了jenv和SDKMAN!这两种更高效的工具方案。

一、安装多个JDK版本
先更新包索引,然后把常用的LTS版本一次性装上,比如OpenJDK 11和OpenJDK 17。两条命令搞定:
sudo apt updatesudo apt install openjdk-11-jdk openjdk-17-jdk
装完后用 ja va -version 看一眼,确认当前默认版本是谁。如果后续要装更多版本,同样的方式追加即可。
二、用系统工具 update-alternatives 切换
这是Ubuntu自带的多版本管理机制,不用额外装任何东西。执行下面这条命令,系统会列出所有已注册的Ja va路径,你只需要输入对应的编号就能切换默认版本:
sudo update-alternatives --config ja va
如果列表里缺了某个你刚安装的JDK,可以手动把它注册进去,顺便指定优先级(数值越高,自动选择时越靠前):
sudo update-alternatives --install /usr/bin/ja va ja va /usr/lib/jvm/ja va-11-openjdk-amd64/bin/ja va 1sudo update-alternatives --install /usr/lib/jvm/ja va-17-openjdk-amd64/bin/ja va 2
顺手把编译器也切一下,不然ja va版本变了ja vac还是旧的,容易出幺蛾子:
sudo update-alternatives --config ja vac
最后用 ja va -version 和 ja vac -version 双重确认,确保切换生效。
三、设置 JA VA_HOME 与环境变量
光切换ja va命令还不够,很多框架和构建工具(像Ma ven、Gradle、Tomcat)都要读 JA VA_HOME 环境变量。这里分三种场景:
给当前用户设置,编辑 ~/.bashrc 或 ~/.zshrc,追加:
export JA VA_HOME=/usr/lib/jvm/ja va-11-openjdk-amd64export PATH=$JA VA_HOME/bin:$PATH
然后执行 source ~/.bashrc 或 source ~/.zshrc 让配置立即生效。
给所有用户设置,更稳妥的做法是写入 /etc/environment:
JA VA_HOME="/usr/lib/jvm/ja va-11-openjdk-amd64"PATH="$JA VA_HOME/bin:$PATH"
修改后重新登录,或者 source /etc/environment 也能生效。
偷懒小技巧:不想每次都写死路径,可以用一行命令从当前默认ja va路径自动推导出JA VA_HOME:
export JA VA_HOME=$(readlink -f /usr/bin/ja va | sed "s:bin/ja va::")
这样不管你用update-alternatives切到哪个版本,JA VA_HOME都会自动跟随。
四、使用版本管理工具 jenv 或 SDKMAN
如果项目间版本切换非常频繁,或者你需要在不同目录下自动切换到不同JDK,那手动管理就有点力不从心了。推荐两个流行工具:
jenv——轻量级,适合精细化控制。安装很简单:
git clone https://github.com/jenv/jenv.git ~/.jenv- 初始化:把两行配置追加到 ~/.bashrc 里——
export PATH="$HOME/.jenv/bin:$PATH"和eval "$(jenv init -)",然后source ~/.bashrc - 添加JDK:
jenv add /usr/lib/jvm/ja va-11-openjdk-amd64、jenv add /usr/lib/jvm/ja va-8-openjdk-amd64 - 切换方式很灵活:全局用
jenv global 11.0,当前shell用jenv shell 8.0,甚至可以针对某个目录用jenv local 17.0,这样进入该目录自动切。
SDKMAN!——更全能,不仅能管理Ja va,还能管理Ma ven、Gradle、Kotlin等一大堆SDK。安装一条命令:
curl -s "https://get.sdkman.io" | bash,然后source "$HOME/.sdkman/bin/sdkman-init.sh"- 使用:
sdk install ja va 11.0.11-open、sdk use ja va 8.0.292-open、sdk default ja va 11.0.11-open。
SDKMAN! 可以自动帮你下载安装并配置好环境,省去手动下载tar包的麻烦。
五、常见问题与排查
即便步骤都走了一遍,偶尔还是会遇到翻车的情况。这里列几个典型场景的应对思路:
版本冲突或残留旧版本——尽量统一使用 update-alternatives 来管理,别同时用手动改软链接加环境变量混着来。如果某个旧版本确实不需要了,用 sudo apt-get remove openjdk- 先卸载,再重新配置默认版本。
某些应用还是用旧版本——比如Tomcat、Jenkins这类服务,它们通常有自己的启动脚本或配置文件,里面可能硬编码了JA VA_HOME。以Tomcat为例,检查 /etc/default/tomcat 或 catalina.sh,找到 JA VA_HOME 变量改成正确路径,然后 sudo systemctl restart tomcat。
环境变量不生效——先确认你改的是哪个配置文件:~/.bashrc、~/.zshrc、/etc/environment 三者的生效范围不一样。执行 echo $JA VA_HOME 看输出对不对,如果为空,八成是语法错了或者没source。实在不行,关掉终端重新打开,或者重新登录一下系统。