引言
本文详细介绍如何在运行于 WSL2的 Ubuntu 22.04 系统上安装和管理多个 Java 版本,包括 OpenJDK 11、17、21 和 Oracle JDK 11、17、21。我们会验证 Ubuntu 22.04 自带的 Java 环境,列出可用 OpenJDK 版本,澄清 OpenJDK 21 的 LTS 状态,确保安装完整的 JDK(包括 javac
),解释如何检查硬件架构以选择正确的 Oracle JDK 版本,并说明如何合理设置 update-alternatives
的优先级。完成后,您将能够无缝切换不同的JDK。
第一步:验证 Ubuntu 22.04 自带的 Java 环境
Ubuntu 22.04 默认情况下可能不包含完整的 OpenJDK 安装,但某些软件包(如 default-jre
或其他依赖)可能导致安装了 Java Runtime Environment(JRE)。JRE 只包含运行 Java 程序所需的环境,而不包括开发工具(如 javac
编译器)。
检查当前 Java 环境:
java -version
如果返回类似以下内容,说明已安装 JRE(以 OpenJDK 11 为例):
openjdk version "11.0.13" 2022-01-18
OpenJDK Runtime Environment (build 11.0.13+8-0ubuntu1~22.04)
OpenJDK 64-Bit Server VM (build 11.0.13+8-0ubuntu1~22.04, mixed mode, sharing)
检查 javac
是否存在:
javac -version
如果返回 command not found
,说明系统中只有 JRE,没有安装完整的 JDK(包括 javac
编译器)。
安装 OpenJDK 11 的完整 JDK
如果系统中只有 JRE,安装 OpenJDK 11 的 JDK 包以获取 javac
等开发工具:
sudo apt install openjdk-11-jdk -y
再次验证:
javac -version
应显示类似:
javac 11.0.13
注意:如果系统中未预装任何 Java 环境,java -version
将返回 command not found
,可直接跳到下一步安装 OpenJDK。
第二步:更新系统软件包
确保系统软件包是最新的,以避免兼容性问题:
sudo apt update && sudo apt upgrade -y
第三步:查询和安装 OpenJDK 版本
Ubuntu 22.04 的软件源中提供了多个 OpenJDK 版本,您可以根据项目需求选择安装 OpenJDK 11、17 或 21。
查询可用 OpenJDK 版本
运行以下命令列出 Ubuntu 22.04 软件源中可用的 OpenJDK 包:
apt search openjdk | grep '^openjdk'
输出可能包括以下常见版本(具体版本可能因软件源更新而略有不同):
openjdk-8-jdk
: OpenJDK 8,适用于较旧的项目,LTS 版本。openjdk-11-jdk
: OpenJDK 11,LTS 版本,广泛用于生产环境。openjdk-17-jdk
: OpenJDK 17,LTS 版本,适合现代 Java 应用。openjdk-21-jdk
: OpenJDK 21,LTS 版本,最新长期支持版本,推荐用于新项目。
注意:OpenJDK 21 是 LTS 版本,发布于 2023 年 9 月 19 日,得到 Oracle 和其他供应商(如 Eclipse Adoptium、Red Hat)的长期支持,通常持续到 2028 年 9 月(部分供应商可能延长至 2031 年)。它是生产环境的理想选择。
安装所需 OpenJDK 版本
根据需求安装特定版本,例如:
sudo apt install openjdk-11-jdk -y
sudo apt install openjdk-17-jdk -y
sudo apt install openjdk-21-jdk -y
验证安装:
java -version
默认情况下,最新安装的 OpenJDK(例如 21)可能成为系统默认版本。
第四步:安装 Oracle JDK
Oracle JDK 需要手动下载和配置。在下载前,必须检查系统硬件架构以确保选择正确的二进制文件。以下以 Oracle JDK 11、17 和 21 为例。
检查硬件架构
在下载 Oracle JDK 之前,确认系统的硬件架构以选择合适的版本(例如 x86_64 或 aarch64)。运行以下命令:
uname -m
输出说明:
x86_64
:表示 64 位 Intel/AMD 架构(最常见,WSL2 默认使用此架构)。aarch64
:表示 64 位 ARM 架构(例如在某些 ARM 设备上)。
注意:WSL2 通常运行在 x86_64 架构上,但如果您在 ARM 设备上运行 Ubuntu,可能是 aarch64。Oracle JDK 11、17 和 21 提供 x86_64 和 aarch64 版本,确保下载匹配的版本。
下载 Oracle JDK
根据硬件架构,访问
Oracle 官方网站
,选择 JDK 11、17 或 21 的 Linux 版本:
- 对于 x86_64 架构,选择 Linux x64 Compressed Archive(例如
jdk-21_linux-x64_bin.tar.gz
)。 - 对于 aarch64 架构,选择 Linux AArch64 Compressed Archive(例如
jdk-21_linux-aarch64_bin.tar.gz
)。
- 对于 x86_64 架构,选择 Linux x64 Compressed Archive(例如
下载文件可能需要 Oracle 账户登录。将下载的文件传输到 WSL2 的 Ubuntu 系统中(例如,保存到
~/Downloads/
目录)。
解压并配置
以 Oracle JDK 21(x86_64 架构)为例,假设文件位于 ~/Downloads/
,执行以下命令:
sudo mkdir -p /usr/local/java
sudo tar -xvzf ~/Downloads/jdk-21_linux-x64_bin.tar.gz -C /usr/local/java
对 Oracle JDK 11 和 17 重复类似操作:
sudo tar -xvzf ~/Downloads/jdk-11_linux-x64_bin.tar.gz -C /usr/local/java
sudo tar -xvzf ~/Downloads/jdk-17_linux-x64_bin.tar.gz -C /usr/local/java
如果使用 aarch64 架构,替换为对应的 aarch64 文件(如 jdk-21_linux-aarch64_bin.tar.gz
)。
设置环境变量
编辑 ~/.bashrc
文件以添加 Oracle JDK 的路径(以 Oracle JDK 21 为例):
nano ~/.bashrc
在文件末尾添加:
export JAVA_HOME=/usr/local/java/jdk-21
export PATH=$JAVA_HOME/bin:$PATH
保存并应用更改:
source ~/.bashrc
验证 Oracle JDK:
java -version
应显示 Oracle JDK 21 的版本信息。切换其他 Oracle JDK 版本时,需相应修改 JAVA_HOME
。
第五步:管理多个 Java 版本
使用 update-alternatives
工具在不同 JDK 版本间切换。
注册 JDK 版本
为每个 JDK 配置替代项(以 OpenJDK 11、17、21 和 Oracle JDK 11、17、21 为例):
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1711
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2111
sudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk-11/bin/java 1101
sudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk-17/bin/java 1701
sudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk-21/bin/java 2101
为 javac
配置替代项:
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-11-openjdk-amd64/bin/javac 1111
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac 1711
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-21-openjdk-amd64/bin/javac 2111
sudo update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk-11/bin/javac 1101
sudo update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk-17/bin/javac 1701
sudo update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk-21/bin/javac 2101
关于优先级(Priority)的解释
在 update-alternatives --install
命令中,格式为:
sudo update-alternatives --install <link> <name> <path> <priority>
<link>
:符号链接的路径(如/usr/bin/java
)。<name>
:替代组的名称(如java
)。<path>
:实际可执行文件的路径(如/usr/lib/jvm/java-11-openjdk-amd64/bin/java
)。<priority>
:一个整数,表示该版本的优先级。数字越大,优先级越高。
优先级的作用:
- 当运行
java
或javac
时,系统会自动选择优先级最高的版本作为默认版本(除非手动指定)。 - 在
update-alternatives --config java
中,优先级高的版本更容易被选为默认。
如何合理设置优先级:
基于版本新旧:给较新的 JDK 设置更高的优先级。例如,OpenJDK 21(LTS)设为
2111
,OpenJDK 17 设为1711
,OpenJDK 11 设为1111
,反映版本号顺序。基于使用频率:如果某个版本(如 OpenJDK 21)是您最常用的,给它设置最高优先级(如
3000
)。基于来源:OpenJDK 和 Oracle JDK 可根据偏好设置优先级。例如,OpenJDK 版本优先级略高于 Oracle JDK(如
2111
vs2101
),以反映社区版本的优先使用。避免冲突:优先级数字应唯一,避免多个版本使用相同优先级导致选择歧义。
建议范围
:使用 1000 以上的数字,便于区分。例如:
- OpenJDK 11:
1111
- OpenJDK 17:
1711
- OpenJDK 21:
2111
(LTS,建议高优先级) - Oracle JDK 11:
1101
- Oracle JDK 17:
1701
- Oracle JDK 21:
2101
- OpenJDK 11:
手动切换:即使设置了优先级,您仍可通过
update-alternatives --config
手动选择任意版本。
切换 Java 版本
交互式选择 Java 版本:
sudo update-alternatives --config java
选择 javac
版本:
sudo update-alternatives --config javac
按提示输入数字选择所需的 JDK。验证当前版本:
java -version
javac -version
动态设置 JAVA_HOME
为不同版本动态设置 JAVA_HOME
,编辑 ~/.bashrc
:
nano ~/.bashrc
添加以下脚本:
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
保存并应用:
source ~/.bashrc
验证:
echo $JAVA_HOME
第六步:验证多版本共存
检查所有安装的 Java 版本:
/usr/lib/jvm/java-11-openjdk-amd64/bin/java -version
/usr/lib/jvm/java-17-openjdk-amd64/bin/java -version
/usr/lib/jvm/java-21-openjdk-amd64/bin/java -version
/usr/local/java/jdk-11/bin/java -version
/usr/local/java/jdk-17/bin/java -version
/usr/local/java/jdk-21/bin/java -version
检查 javac
:
/usr/lib/jvm/java-11-openjdk-amd64/bin/javac -version
/usr/lib/jvm/java-17-openjdk-amd64/bin/javac -version
/usr/lib/jvm/java-21-openjdk-amd64/bin/javac -version
/usr/local/java/jdk-11/bin/javac -version
/usr/local/java/jdk-17/bin/javac -version
/usr/local/java/jdk-21/bin/javac -version
切换版本后,运行 java -version
、javac -version
和 echo $JAVA_HOME
确保配置正确。
注意事项
- Ubuntu 22.04 默认 JRE:部分 Ubuntu 22.04 镜像(尤其在 WSL2 中)可能因依赖(如某些 IDE 或工具)预装 OpenJDK 11 的 JRE,但不含
javac
。安装openjdk-XX-jdk
可补全开发工具。 - OpenJDK 版本支持:Ubuntu 22.04 默认软件源通常包括 OpenJDK 8、11、17 和 21(均为 LTS)。OpenJDK 21 是 LTS 版本,适合生产环境,支持至 2028 年 9 月(或更久)。
- Oracle JDK 架构选择:下载 Oracle JDK 前,务必通过
uname -m
检查硬件架构(通常为 x86_64 或 aarch64),以确保选择正确的二进制文件。WSL2 默认使用 x86_64,但 ARM 设备可能为 aarch64。 - Oracle JDK 许可:Oracle JDK 11、17 和 21 需要遵守许可协议,可能需要 Oracle 账户登录下载。Oracle JDK 21 在生产环境中免费,但需注意其许可条款。
- WSL2 磁盘空间:WSL2 的磁盘空间有限,建议定期清理不再需要的 JDK 版本。
- 权限问题:若遇到权限问题,使用
sudo
或检查文件权限(如/usr/local/java
)。 - 优先级冲突:确保
update-alternatives
配置的优先级唯一且合理,建议按 LTS 状态或使用频率设置(如2111
为 OpenJDK 21,2101
为 Oracle JDK 21)。
总结
通过以上步骤,您可以在 Ubuntu 22.04(WSL2)上安装和管理多个 Java 版本,包括 OpenJDK 11、17、21 和 Oracle JDK 11、17、21。使用 apt search
查询可用 OpenJDK 版本,检查硬件架构(通过 uname -m
)以选择正确的 Oracle JDK 二进制文件,update-alternatives
工具通过合理设置优先级实现版本切换。OpenJDK 21 作为 LTS 版本(支持至 2028 年 9 月或更久)是生产环境的理想选择,Oracle JDK 提供类似功能但需注意许可条款。特别注意,Ubuntu 22.04 可能自带 OpenJDK 11 的 JRE,需手动安装 JDK 以获取 javac
等开发工具。
如有疑问,请查阅 OpenJDK 文档 或 Oracle JDK 文档,或在下方留言获取帮助。
希望这篇博客对您的 Java 开发环境配置有所帮助!