
Java中如何安装并配置JDK多版本
为什么需要管理多个JDK版本
在日常Java开发中,不同项目往往对JDK版本有不同要求。老项目可能基于JDK 8开发,使用了大量过时的API,迁移成本高;而新项目则希望享受JDK 17带来的新特性,比如密封类、模式匹配、Record等。如果只安装一个JDK版本,每次切换项目都要卸载重装,不仅浪费时间,还容易因为残留配置导致环境混乱。
更常见的场景是:你同时维护一个公司内部的遗留系统和参与一个新的微服务项目。遗留系统只能用JDK 8编译,否则会出现兼容性问题;新项目团队统一要求JDK 17。这时,在一台电脑上安装多个JDK版本,并能随时切换,就成了必备技能。
除了项目需求,学习也需要多版本。比如你想对比JDK 8和JDK 11在垃圾回收方面的差异,或者测试你的代码在新版本下是否还能正常运行。掌握多版本管理,可以让你在不同环境间自如切换,避免反复安装卸载的麻烦。
一、Windows系统下JDK多版本安装配置
1.1 下载并安装多个JDK版本
首先,你需要从Oracle官网或OpenJDK官方站点下载所需版本的JDK安装包。以JDK 8和JDK 17为例,分别下载对应Windows x64的安装程序。
运行安装程序时,最关键的一点是选择不同的安装目录。千万不要接受默认路径,因为默认路径通常只包含版本号的一部分,容易混淆。建议统一放在一个专门的文件夹下,比如 `C:\Java`。你可以这样规划:
- JDK 8 安装到
C:\Java\jdk1.8.0_301 - JDK 17 安装到
C:\Java\jdk-17.0.1
为什么要分开目录?因为每个JDK版本包含自己的bin目录、lib目录、include目录等,如果安装在同一目录,后面的版本会覆盖前面的文件,导致两个版本都无法正常使用。分开存放后,每个版本都是独立的,互不影响。
安装过程中,有些安装程序会提示是否安装公共JRE。对于JDK 8及以前版本,可以选择安装;JDK 11以后,JRE已经整合到JDK中,不再单独提供。无论如何,你只需要确保JDK本身的安装成功即可。
1.2 配置多版本环境变量
Windows的环境变量配置是多版本管理的核心。思路是:为每个JDK版本定义一个独立的环境变量,再用一个主变量JAVA_HOME指向当前要使用的版本,最后将%JAVA_HOME%\bin添加到系统Path中。
第一步:新建版本专用变量
打开系统属性 → 高级 → 环境变量,在“系统变量”区域点击“新建”,创建以下两个变量:
- 变量名:
JAVA8_HOME,变量值:C:\Java\jdk1.8.0_301 - 变量名:
JAVA17_HOME,变量值:C:\Java\jdk-17.0.1
第二步:创建或修改 JAVA_HOME
接着,新建或编辑系统变量JAVA_HOME,将其值设置为%JAVA8_HOME%或%JAVA17_HOME%。例如,如果你想默认使用JDK 8,就填%JAVA8_HOME%。这里的百分号表示引用其他变量的值,是一种间接引用的技巧,方便后续切换。
第三步:更新 Path 变量
在系统变量中找到Path,双击编辑。点击“新建”,添加%JAVA_HOME%\bin。注意,一定要删除之前可能存在的其他JDK路径,比如C:\Program Files\Java\jdk-17\bin这样的绝对路径。因为如果有多个bin目录在Path中,系统会按照顺序找到第一个可执行的java.exe,可能导致版本混乱。只保留%JAVA_HOME%\bin这一条动态路径,这样切换JAVA_HOME时,Path自动跟随变化。
1.3 验证配置是否生效
配置完成后,需要重新打开一个命令提示符窗口(Win+R → cmd)。输入以下命令:
java -version如果显示的是JDK 8的版本信息,说明当前使用的是JDK 8。如果想切换到JDK 17,只需回到环境变量设置,将JAVA_HOME的值改为%JAVA17_HOME%,然后保存。再次打开新的命令提示符,输入java -version,就会看到JDK 17的信息。
注意:已经打开的命令提示符窗口不会感知环境变量变化,必须关闭后重新打开。这是因为环境变量在进程启动时被读取并缓存,后续修改不会影响已运行的进程。
1.4 切换版本的小技巧
每次手动修改环境变量比较麻烦,你可以创建一个批处理文件(.bat)来实现一键切换。例如,创建switch_to_jdk8.bat,内容如下:
@echo off
setx JAVA_HOME "%JAVA8_HOME%" /M
echo Switched to JDK 8. Please restart command prompt.同理创建switch_to_jdk17.bat。以管理员身份运行这些批处理文件,就能快速修改系统变量。不过修改后仍需要重启命令提示符才能生效。
二、Linux系统下JDK多版本安装配置
2.1 解压安装多个JDK版本
Linux环境下,通常使用tar.gz压缩包进行安装。首先将下载好的JDK压缩包上传到服务器,建议统一存放在/usr/local/java目录下。执行以下命令解压:
# 创建目标目录
sudo mkdir -p /usr/local/java
# 解压JDK 8
sudo tar -zxvf jdk-8u301-linux-x64.tar.gz -C /usr/local/java/
# 解压JDK 17
sudo tar -zxvf jdk-17.0.1_linux-x64_bin.tar.gz -C /usr/local/java/解压后,你会得到两个目录:/usr/local/java/jdk1.8.0_301和/usr/local/java/jdk-17.0.1。这两个目录各自包含了完整的JDK文件。
2.2 使用 alternatives 命令管理多版本
Linux提供了一个非常方便的工具叫alternatives(在CentOS/RHEL上可用,Ubuntu上对应的是update-alternatives),它可以管理系统中的多个同类型软件版本,比如多个JDK、多个Python等。
注册JDK 8
sudo alternatives --install /usr/bin/java java /usr/local/java/jdk1.8.0_301/bin/java 1
sudo alternatives --install /usr/bin/javac javac /usr/local/java/jdk1.8.0_301/bin/javac 1注册JDK 17
sudo alternatives --install /usr/bin/java java /usr/local/java/jdk-17.0.1/bin/java 2
sudo alternatives --install /usr/bin/javac javac /usr/local/java/jdk-17.0.1/bin/javac 2命令末尾的数字是优先级,数字越大优先级越高。这里JDK 17的优先级设为2,所以如果不手动选择,系统默认会使用JDK 17。你也可以根据需要调整优先级。
为什么要分别注册java和javac?因为它们是两个不同的命令,都需要指向正确的版本。此外,还可以注册jar、jlink等其他常用工具,但通常java和javac就够用了。
2.3 切换并验证版本
执行以下命令来手动选择当前使用的JDK版本:
sudo alternatives --config java系统会列出所有已注册的java版本,并提示输入序号。例如:
There are 2 programs which provide 'java'.
Selection Command
-----------------------------------------------
* 1 /usr/local/java/jdk1.8.0_301/bin/java
+ 2 /usr/local/java/jdk-17.0.1/bin/java
Enter to keep the current selection[+], or type selection number:输入对应的数字(比如1),然后按回车。同样地,也需要对javac执行一次切换:
sudo alternatives --config javac切换完成后,验证版本:
java -version
javac -version如果输出与你选择的版本一致,说明配置成功。
2.4 通过环境变量方式管理(备选方案)
如果你不喜欢使用alternatives,也可以像Windows一样通过环境变量来控制。编辑/etc/profile或~/.bashrc,添加如下内容:
export JAVA8_HOME=/usr/local/java/jdk1.8.0_301
export JAVA17_HOME=/usr/local/java/jdk-17.0.1
export JAVA_HOME=$JAVA8_HOME
export PATH=$JAVA_HOME/bin:$PATH需要切换时,修改JAVA_HOME的赋值,然后执行source /etc/profile使配置生效。但这种方式不如alternatives优雅,因为alternatives是系统级的管理工具,对所有用户生效,且切换命令更直观。
三、多版本管理的进阶技巧
3.1 在IDE中指定JDK版本
很多时候,你并不需要全局切换JDK版本,而是希望某个项目使用特定版本。现代IDE(如IntelliJ IDEA、Eclipse)都支持为每个项目单独配置JDK。
在IntelliJ IDEA中,进入 File → Project Structure → SDKs,可以添加多个JDK路径。然后在每个模块的 Project Settings 中选择对应的SDK。这样,你可以在同一个IDE窗口中同时打开JDK 8和JDK 17的项目,互不干扰。
3.2 使用构建工具指定JDK
如果你使用Maven或Gradle,可以在项目配置中指定编译级别,而不需要关心全局JDK版本。例如,在Maven的pom.xml中:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>这样即使全局JAVA_HOME指向JDK 17,Maven也会强制使用JDK 8的语法进行编译(前提是你安装了JDK 8并且Maven能找到它)。但要注意,如果全局JDK版本太低,而项目要求高版本,编译会失败。所以稳妥的做法是让全局JDK版本不低于项目中要求的最高版本,然后用构建工具限制编译级别。
3.3 使用版本管理工具(如 SDKMAN)
对于Linux和macOS用户,还有一个更强大的工具叫 SDKMAN。它可以管理多个JDK版本、Maven、Gradle、Spring Boot CLI等。安装SDKMAN后,只需一行命令就能安装任意JDK版本:
sdk install java 8.0.302-open
sdk install java 17.0.1-open切换版本也极其简单:
sdk use java 8.0.302-openSDKMAN会自动管理环境变量,无需手动配置。它是目前最推荐的Java多版本管理方案,尤其适合频繁切换的开发场景。
四、常见问题与解决方案
4.1 版本切换后不生效
Windows:修改环境变量后,必须重新打开命令提示符窗口。如果仍然不生效,检查Path中是否还有其他JDK路径排在前面。可以在命令提示符中执行where java,查看系统找到的第一个java.exe位于哪里。如果指向了错误的位置,说明Path中存在其他JDK路径未被清除。
Linux:使用alternatives切换后,如果新终端中版本未变,可能是因为shell缓存。执行hash -r清除缓存,或者重新登录终端。另外,检查是否在.bashrc中手动设置了JAVA_HOME,这可能会覆盖alternatives的设置。
4.2 项目无法编译,报错“不支持发行版本”
这通常是因为Maven或Gradle配置的编译级别与当前使用的JDK版本不匹配。例如,项目配置了<maven.compiler.source>17</maven.compiler.source>,但全局JDK却是8。解决方法:要么升级全局JDK,要么降低项目配置。建议保持全局JDK为较新版本,然后在项目中通过配置向下兼容。
4.3 多个JDK版本导致环境变量混乱
有些开发者喜欢在Path中添加多个JDK的bin路径,比如同时包含C:\Java\jdk1.8.0_301\bin和C:\Java\jdk-17.0.1\bin。这样做会导致系统使用最先找到的那个版本,而你很难控制到底是哪一个。强烈建议只保留%JAVA_HOME%\bin这一条动态路径,并通过修改JAVA_HOME来切换。
五、总结
安装并配置多个JDK版本是Java开发者的基本功。Windows下通过环境变量间接引用实现灵活切换,Linux下使用alternatives工具更为标准。无论哪种方式,核心原则都是:每个版本独立安装,通过一个统一的入口(JAVA_HOME或alternatives)来控制当前激活的版本。
掌握了这些方法,你就可以在同一台机器上同时维护多个Java项目,而不用担心环境冲突。如果再配合IDE的项目级SDK配置和构建工具的编译级别设置,你的开发效率将大幅提升。现在就去试试吧,让你的开发环境从此告别混乱。