Ubuntu配置多版本Java,自由切换

在 Ubuntu 22.04 上安装 OpenJDK 并实现 在不同项目中灵活切换 Java 版本,可以使用 update-alternatives + 环境变量管理两种方式实现

方法一:使用 update-alternatives(系统级切换,简单可靠)

1:安装多个 OpenJDK 版本

Ubuntu 官方仓库支持多个 OpenJDK 版本(如 8、11、17、21):

复制代码
# 更新包列表
sudo apt update

# 安装你需要的 JDK 版本(例如 11 和 17)
sudo apt install openjdk-11-jdk openjdk-17-jdk openjdk-21-jdk

2:配置 update-alternatives

系统会自动为每个 JDK 注册 javajavac 等命令,但我们可以手动确认或添加:

如果未自动注册,可手动添加(以 JDK 17 为例):

复制代码
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1700
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac 1700

3:交互式切换版本

复制代码
# 切换 java 命令
sudo update-alternatives --config java

# 切换 javac 命令
sudo update-alternatives --config javac

然后选择对应编号即可。


方法二:使用 jenv(项目级自动切换,推荐开发者使用)

jenv 是一个类似 rbenv/pyenv 的 Java 版本管理工具,可以为每个项目目录自动切换 JDK 版本

1:安装 jenv

复制代码
# 安装依赖
sudo apt install git curl

# 克隆 jenv 到本地
git clone https://github.com/jenv/jenv.git ~/.jenv

2:配置 shell(以 Bash 为例)

编辑 ~/.bashrc(如果你用 Zsh,则编辑 ~/.zshrc):

复制代码
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(jenv init -)"' >> ~/.bashrc
source ~/.bashrc

⚠️ 注意:eval "$(jenv init -)" 必须在 PATH 设置之后。

3:让 jenv 识别已安装的 JDK

复制代码
# 自动检测系统 JDK(包括 /usr/lib/jvm 下的 OpenJDK)
jenv enable-plugin export
jenv enable-plugin maven
jenv add /usr/lib/jvm/java-11-openjdk-amd64
jenv add /usr/lib/jvm/java-17-openjdk-amd64
jenv add /usr/lib/jvm/java-21-openjdk-amd64

如果提示权限问题,确保这些目录可读。

查看已注册版本:

复制代码
jenv versions

输出示例:

复制代码
* system (set by /home/ball/.jenv/version)
  11.0
  11.0.21
  17.0
  17.0.9
  21.0
  21.0.1

4:为项目设置 Java 版本

进入你的项目目录,运行:

复制代码
cd ~/my-java-project
jenv local 17.0    # 会在当前目录生成 .java-version 文件

以后只要进入该目录,java -version 就会自动使用 JDK 17!

验证:

复制代码
cd ~/my-java-project
java -version   # 应显示 17
cd ~
java -version   # 回到全局默认(或 system)
相关推荐
名字还没想好☜28 分钟前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
easy_coder38 分钟前
Linux LVM 知识文档
linux·运维
圆山猫44 分钟前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
caishenzhibiao1 小时前
期货先行者主图 同花顺期货通指标
java·c语言·c#
史呆芬1 小时前
分布式事务实战:微服务跨服务数据一致性解决方案
java·后端·spring cloud
IT界的老黄牛1 小时前
限流命中后该怎么办:直接丢、阻塞等待、延迟重投三种姿势的取舍
java·rocketmq·redisson·令牌桶·削峰·分布式限流
小小的木头人1 小时前
Ubuntu 使用 udev + systemd + UUID 实现 USB 硬盘自动挂载
linux·运维·ubuntu
daad7772 小时前
记录matlab状态机demo
java·网络·matlab
牡丹雅忻13 小时前
AES 加密模式演进:从 ECB、CBC 到 GCM 的 C# 深度实践
java·开发语言·c#
kaoa0003 小时前
Linux入门攻坚——84、网络虚拟化技术-1
linux·运维·服务器