Java开发过程中,经常需要在不同项目间切换不同版本的JDK。Linux系统提供了多种方式来管理多个JDK版本,本文将介绍几种常用的方法。
1. 使用 update-alternatives 工具
update-alternatives是Linux系统中管理软件替代品的工具,适用于Debian/Ubuntu/RedHat等系统。
安装JDK
使用包管理工具安装的JDK会自动注册到系统
# 安装OpenJDK 8
sudo apt install openjdk-8-jdk
# 安装OpenJDK 11
sudo apt install openjdk-11-jdk
# 安装OpenJDK 17
sudo apt install openjdk-17-jdk如果是手动安装的JDK,则需要手动注册到系统(如果上述未自动注册到系统的,也可以手动注册下)
# 以手动安装的JDK 17为例,路径为/usr/local/jdk-17.0.9
sudo update-alternatives --install /usr/bin/java java /usr/local/jdk-17.0.9/bin/java 100
sudo update-alternatives --install /usr/bin/javac javac /usr/local/jdk-17.0.9/bin/javac 100
# 数值100是优先级(越高越优先被默认选择)卸载JDK
包管理器安装的 JDK:
# 卸载OpenJDK 17
sudo apt remove openjdk-17-jdk手动安装的 JDK:
删除解压目录
移除update-alternatives注册:
sudo update-alternatives --remove java /usr/local/jdk-17.0.9/bin/java
sudo update-alternatives --remove javac /usr/local/jdk-17.0.9/bin/javac配置alternatives
# 设置默认JDK
sudo update-alternatives --config java
# 设置默认 javac
sudo update-alternatives --config javac执行后会列出所有已注册的版本,输入序号即可切换。
其中 Status 为 auto mode(默认把注册时优先级最高的设置为这个) 或 manual mode(其他的则设置为这个)
2. 手动配置环境变量
部分工具或应用需要通过JAVA_HOME环境变量定位 JDK 路径,这种方法适用于需要精确控制JDK版本的情况。
设置JAVA_HOME
# 编辑~/.bashrc或~/.profile文件
vim ~/.bashrc
# 添加以下内容
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
# 使配置生效
source ~/.bashrc
创建切换脚本
# 创建jdk切换脚本
vim jdk_switch.sh
#!/bin/bash
case $1 in
8)
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
;;
11)
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
;;
17)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
;;
*)
echo "Usage: $0 {8|11|17}"
exit 1
;;
esac
export PATH=$JAVA_HOME/bin:$PATH
echo "JAVA_HOME set to $JAVA_HOME"
# 赋予执行权限
chmod +x jdk_switch.sh
# 使用脚本切换JDK
./jdk_switch.sh 11 # 切换到JDK 11
3. 使用JEnv工具
JEnv是一个专门用于管理多个JDK版本的轻量级工具。
安装JEnv
# 克隆JEnv仓库
git clone https://github.com/jenv/jenv.git ~/.jenv
# 添加到环境变量(根据使用的shell选择对应配置文件)
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(jenv init -)"' >> ~/.bashrc
# Zsh用户
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc
# 使配置生效
source ~/.bashrc
验证安装
jenv --version # 输出版本号即安装成功添加JDK到JEnv
jenv 本身不安装 JDK,需先手动安装所需版本的 JDK(通过包管理器或手动解压),再将其路径添加到 jenv 中。
# 添加本地已安装的JDK(包管理器安装的 OpenJDK:通常在 /usr/lib/jvm/ 目录下)
jenv add /usr/lib/jvm/java-8-openjdk-amd64
jenv add /usr/lib/jvm/java-11-openjdk-amd64
jenv add /usr/lib/jvm/java-17-openjdk-amd64
# 查看已添加的JDK版本(带*的是当前激活版本)
jenv versions
切换JDK版本
jenv 支持三种级别的版本切换(优先级:局部 > shell > 全局):
1. 全局默认版本(系统级,默认生效)
bash
jenv global 11.0 # 设置全局默认版本为11.x(版本号可简写,如11.0、17.0)
2. 当前 shell 会话临时版本
bash
jenv shell 17.0 # 仅当前终端会话使用17.x版本,关闭终端后失效
3. 项目局部版本(仅当前目录及子目录生效)
在项目根目录执行:
jenv local 11.0 # 会生成一个.java-version文件记录当前项目的版本
进入该目录时,jenv 会自动切换到指定版本。
其他常用命令
# 查看当前激活的JDK版本
jenv version
# 移除已添加的JDK
jenv remove 17.0.9 # 版本号需完整(可通过jenv versions查看)
# 刷新jenv配置(添加新JDK后建议执行)
jenv rehash
# 配置JAVA_HOME环境变量(关键!很多工具依赖此变量)
jenv enable-plugin export # 启用export插件,自动管理JAVA_HOME
source ~/.bashrc # 重新加载配置后生效注意事项
添加 JDK 时路径需指向 JDK 根目录(包含 bin、lib 等子目录的目录)。
切换版本后,
java、javac等命令会自动指向对应版本。若使用 IDE(如 IntelliJ IDEA),需在 IDE 中手动指定项目使用的 JDK 版本(jenv 切换不影响 IDE 内部配置)。
4. 使用SDKMAN工具
SDKMAN!是一个软件开发工具管理器,支持管理JDK、Maven、Gradle等多种工具。
安装SDKMAN
# 安装SDKMAN!
curl -s "https://get.sdkman.io" | bash
# 重启终端或执行
source "$HOME/.sdkman/bin/sdkman-init.sh"
安装和管理JDK
# 查看可用的JDK版本
sdk list java
# 安装特定版本的JDK
sdk install java 8.0.322-zulu
sdk install java 11.0.15-zulu
sdk install java 17.0.3-zulu
# 查看已安装的JDK
sdk list java | grep installed
# 切换默认JDK
sdk default java 11.0.15-zulu
# 临时切换JDK
sdk use java 17.0.3-zulu
5. 使用Docker容器
对于需要完全隔离的环境,可以使用Docker容器来运行不同版本的JDK。
拉取不同版本的OpenJDK镜像
# 拉取不同版本的JDK镜像
docker pull openjdk:8
docker pull openjdk:11
docker pull openjdk:17
运行容器
# 运行JDK 8容器
docker run -it --rm openjdk:8 bash
# 运行JDK 11容器
docker run -it --rm openjdk:11 bash
# 运行JDK 17容器
docker run -it --rm openjdk:17 bash
挂载代码运行
# 挂载当前目录并运行Java程序
docker run -it --rm -v $(pwd):/app -w /app openjdk:11 java -jar your-app.jar
总结
以上介绍了Linux系统切换多JDK版本的几种常用方法:
update-alternatives:适用于Debian/Ubuntu/RedHat系统,系统级管理
手动配置环境变量:灵活但需要手动维护
JEnv:轻量级专用工具,支持目录级别版本控制
SDKMAN:功能全面的工具管理器,支持多种开发工具
Docker容器:提供完全隔离的环境
评论区