最近连着维护好几个项目,Java 版本换来换去。一个老系统还在用 Spring Boot 2.x,只能跑 JDK 8;一个内部工具链锁在 JDK 11;新项目想直接用 JDK 21 的虚拟线程。之前我的“办法”是装个新 JDK,然后把项目编译 target 调到 8,结果 javac 版本检查、Lombok 兼容性、Gradle 插件报错一个接一个。后来干脆同时装了几套 JDK,靠手动改 JAVA_HOME 和 PATH 切换,一个上午被“明明改了却没生效”折腾到怀疑人生。
最后我决定写一套 PowerShell 脚本,把 Windows 下的 JDK 多版本管理做成命令行操作:jdk list 看列表,jdk install 17 一键下载安装,jdk use 8 秒切版本。不需要管理员权限,不污染系统 PATH,当前终端立即生效,新开终端也会持久生效。这篇文章把完整脚本和里面的设计思路都摊开来讲,适合所有在 Windows 上做 Java 开发、经常被多个版本绑架的人。
1. 痛点复盘:多版本 JDK 为什么总是相互打架
1.1 我遇到的实际场景
先说你最可能遇到的现场。假设电脑目前装了 JDK 17,日常开发没问题。但是突然要排查一个老项目,这个项目用了 Elasticsearch 7.x 的客户端和旧版 Lombok,必须在 JDK 8 下编译,否则一堆反射警告甚至直接报 UnsupportedClassVersionError。
你下载 JDK 8,装到一个目录,打开系统属性,把 JAVA_HOME 指向 JDK 8,把 PATH 里的 java.exe 也改成 JDK 8 的目录。点确定后,打开新的 cmd 执行 java -version,结果可能还是 17,或者显示 8 了,但 Maven 打包时又告诉你用的是 17。等你不厌其烦地切回 17,另一个在跑的 Elasticsearch 单机节点又起不来了,因为它启动时读的还是老的环境变量。
如果你还要同时维护 Java 8 和 Java 17 的工具链,那就更痛苦:javac、jar、jcmd、jstack 全部由同一个 PATH 决定,换一个等于把所有命令行工具全换一遍。
| 场景 | 需要的 JDK | 不切版
