配置两个JDK的关键在于灵活管理环境变量
在同一个操作系统上安装并配置多个JDK版本,核心思路是通过控制 JAVA_HOME 和 PATH 环境变量的指向来实现版本切换,手动修改系统变量是最直接的方法,但工作繁琐且容易出错;更推荐使用专业工具(如 SDKMAN、jEnv)或IDE 内置的 JDK 管理功能,既能保持系统整洁,又能实现项目级自动切换,无论采用哪种方式,掌握环境变量作用原理是根本,否则配置再多版本也无法真正“使用”。
为什么需要两个JDK?
在实际开发、测试或运维中,多个JDK版本共存是常见需求:
- 项目兼容性:老旧项目可能依赖 JDK 8,而新项目要求 JDK 11 或 17,频繁卸载重装不现实。
- 功能验证:测试新特性(如 JDK 21 的虚拟线程)时,需要同时保留生产环境的稳定版本。
- 工具链依赖:某些构建工具(如 Maven、Gradle)或 CI/CD 流水线可能指定特定 JDK 版本。
- 学习与实验:开发者需要快速切换不同版本对比行为差异,或参与开源项目时匹配上游要求。
手动配置:修改环境变量实现版本切换
安装两个JDK
分别下载 JDK 8 和 JDK 17(以常见版本为例),安装到不同目录,
C:jdk-8u321C:jdk-17.0.2
设置环境变量
- 创建两个
JAVA_HOME变量值:JAVA_HOME8和JAVA_HOME17(分别指向对应安装目录)。 - 创建
JAVA_HOME变量,初始指向其中一个,如%JAVA_HOME8%。 - 将
%JAVA_HOME%bin添加到PATH变量中,并确保它位于其他可能包含 java.exe 的路径之前。
切换方法
需要切换时,修改 JAVA_HOME 的值为 %JAVA_HOME17%,然后重新打开命令提示符

或执行 refreshenv(Windows 需借助工具或重新登录)生效,Linux/macOS 可通过 export JAVA_HOME=... 并更新 $PATH。
缺点:手动操作容易出错,且无法做到项目级自动切换。
推荐方案:使用 SDKMAN 或 jEnv 管理多版本
SDKMAN(适用于 Linux/macOS/Windows WSL)
# 安装 SDKMAN curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" # 安装多个 JDK 版本 sdk install java 8.0.402-tem sdk install java 17.0.10-tem # 切换当前会话默认版本 sdk use java 17.0.10-tem # 设置项目目录自动切换 # 在项目根目录创建 .sdkmanrc 文件,内容如:java=17.0.10-tem
jEnv(适用于 macOS/Linux)
# 安装 jEnv brew install jenv echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc eval "$(jenv init -)" # 添加已安装的 JDK 路径 jenv add /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home jenv add /Library/Java/JavaVirtualMachines/jdk-8.jdk/Contents/Home # 设置全局或本地版本 jenv global 17.0 jenv local 8.0 # 在项目目录下执行,自动切换
优势:工具自动管理 JAVA_HOME 和 PATH,支持目录级自动切换,无需手动改环境变量,兼容主流 CI/CD 流程。
环境变量配置的底层原理
无论哪种方式,最终都是通过操作系统如何找到 java 命令来生效:
JAVA_HOME被许多 Java 工具(如 Maven、Tomcat、Gradle)读取,决定运行时的 JDK 版本。PATH中的%JAVA_HOME%bin决定了在命令行直接输入java时调用哪个版本。- 配置冲突时,优先级取决于
PATH中搜索顺序,手动配置时务必确保想要的版本路径排在前面。
关键点:JAVA_HOME 可以独立于

PATH 设置,但大多数工具依赖 JAVA_HOME,而命令行直接执行 java 依赖 PATH。两者必须保持一致,否则会出现“明明 java -version 显示 JDK 8,但 Maven 却用了 JDK 17”的奇怪问题。
IDE 中配置多 JDK 项目
IntelliJ IDEA 和 Eclipse 都支持项目级 JDK 设置,无需依赖系统环境变量。
- IntelliJ IDEA:
File→Project Structure→SDK→ 添加多个 JDK 安装路径,然后在每个模块的Module Settings中指定所需 SDK。 - Eclipse:
Window→Preferences→Java→Installed JREs→ 添加多个 JRE,再在项目属性中Java Build Path选择对应版本。
这样,不同项目可以独立使用不同 JDK,不受系统全局环境变量影响,但注意,构建工具(如 Maven)的 JAVA_HOME 仍会读取系统变量,如需完全隔离,应配合工具配置。
酷番云经验案例:云端开发环境多 JDK 管理
我们在 酷番云云服务器 上为多个客户搭建过统一开发环境,其中有一个典型场景:客户需要同时维护 JDK 8 微服务集群和 JDK 17 新网关项目。
推荐方案:使用 SDKMAN + 酷番云弹性云主机,通过以下步骤实现零切换成本:
- 在云服务器上通过 SDKMAN 安装 JDK 8 和 JDK 17,并分别标记为
default和active。 - 在项目目录中创建
.sdkmanrc文件,指定版本,配合 酷番云对象存储(COS) 备份配置,确保新服务器克隆后自动生效。 - 利用 酷番云容器实例 的 JDK 镜像,构建时锁定版本,部署时无需关心宿主机环境。
体验提升:因为 SDKMAN 可以无侵入地管理 JAVA_HOME,客户在更换酷番云主机时只需重新安装 SDKMAN 并执行

sdk install,无需重配环境变量,迁移时间从 2 小时缩短到 15 分钟,结合 酷番云监控服务,我们还能实时跟踪不同 JDK 版本下应用的 GC 和内存指标,帮助客户快速定位因版本差异导致的性能瓶颈。
常见问题与解决方案
Q1:配置了两个 JDK,但切换后 java -version 显示的还是旧版本,怎么办?
解答:检查 PATH 环境变量中是否遗忘了旧版本的路径。删除或移除旧 JDK 的 bin 目录,确保新版本路径位于最前面,同时确认 JAVA_HOME 已正确指向新版本,如果仍无效,在 Windows 中需重新打开命令提示符(或重启系统),因为环境变量修改不会立即生效,在 Linux/macOS 中,执行 hash -r 或 source ~/.bashrc 刷新缓存。
Q2:项目使用 Maven,但 Maven 编译时始终使用 JDK 8,而我希望它用 JDK 17,怎么办?
解答:Maven 默认使用 JAVA_HOME 环境变量决定 JDK 版本,你有两个选择:
- 全局修改:将
JAVA_HOME指向 JDK 17,同时确保PATH中对应bin路径正确。 - 项目级修改:在 Maven 的
pom.xml中通过maven-compiler-plugin指定source和target版本(如 17),同时设置executable指向 JDK 17 的javac绝对路径;或者使用 Maven 的 Toolchains 机制,在toolchains.xml中定义多个 JDK 路径,推荐后者,它不依赖全局环境变量,适合多项目并行。
互动环节
配置多 JDK 是每个 Java 开发者的必修课,但不同操作系统、不同使用场景下的最佳实践可能大相径庭,你在实际工作中遇到过哪些棘手的版本切换问题?或者你有更高效的配置技巧?欢迎在评论区分享你的经验,我们一起探讨更优雅的解决方案。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/668945.html

