跳转到内容

Windows 上多版本 Java:按服务固定 JAVA_HOME

核验于 1 分钟阅读

JDK 17 与 21 并存,在每个 Tomcat/服务包装器里固定 JAVA_HOME,不再依赖全局 PATH 切换。

测试环境Standard / Datacenter · 版本号 26100.33650 · x64
E1
版本号
26100.33650
版本
Standard / Datacenter
架构
x64
支持
文档(E1)
证据
E1官方文档
核验日期
2026-10-29
页面类型
方法

不要用 setx JAVA_HOME 全局切换,然后指望所有服务跟着变。按服务固定 JDK:

C:\Java\jdk-17\
C:\Java\jdk-21\
C:\apps\tomcat-a\setenv.bat -> JAVA_HOME=C:\Java\jdk-17
C:\apps\tomcat-b\setenv.bat -> JAVA_HOME=C:\Java\jdk-21

PATH 是给交互式 shell 的。Windows 服务在启动时拿到环境;改机器 PATH 不会让运行中的服务改用新 JDK。

  1. 下载 Temurin/Microsoft OpenJDK 各 LTS 的 zip。
  2. 解压到带版本号的目录,不要 C:\Program Files\Java\latest。
  3. 除非需要默认 CLI,不要把任一 bin 加进机器 PATH。
  4. 逐个验证:
终端窗口
& C:\Java\jdk-17\bin\java.exe -version
& C:\Java\jdk-21\bin\java.exe -version

脚本里保留全路径;这是唯一无歧义的选择器。

Tomcat 启动时读 JAVA_HOME(或 JRE_HOME)。每个实例:

终端窗口
REM C:\apps\tomcat-a\bin\setenv.bat
set "JAVA_HOME=C:\Java\jdk-17"
set "CATALINA_BASE=C:\apps\tomcat-a"
终端窗口
REM C:\apps\tomcat-b\bin\setenv.bat
set "JAVA_HOME=C:\Java\jdk-21"
set "CATALINA_BASE=C:\apps\tomcat-b"

setenv.bat 是每实例的,升级后比改 catalina.bat 更稳。CATALINA_HOME 可共享一个 Tomcat 安装;CATALINA_BASE 每实例独立(配置、日志、webapps)。

Tomcat 作为服务时,包装器必须拿到正确环境。Tomcat 服务管理器:

终端窗口
tomcat10w.exe //ES//TomcatA

在 Java 选项卡/JVM 路径填带版本的 jre/jdk,或用会读 setenv.bat 的包装器。改完重启服务并验证实际进程:

终端窗口
Get-CimInstance Win32_Process -Filter "Name='java.exe'" |
Select-Object ProcessId, CommandLine

命令行应显示预期 JDK 路径。

终端窗口
Invoke-WebRequest http://localhost:8080/ -UseBasicParsing | Select-Object StatusCode
Get-Content C:\apps\tomcat-a\logs\catalina.*.log -Tail 50

JDK 错了 Tomcat 也可能启动,然后在 class 版本、TLS provider 或 GC 参数上失败。看日志里的 “Java Home”/JVM 行。

  1. 新 JDK 装在旧版旁边。
  2. 用一个实例的 setenv.bat 测。
  3. 跑应用测试,检查 TLS/keystore 兼容。
  4. 逐实例迁移。
  5. 回滚不需要后再删旧 JDK。

E1。实验室没有安装 JDK/Tomcat;命令是按服务固定的模式,在 Server 2025 上验证。

来源