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

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

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29

## 一句话结论

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

```text
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. 逐个验证：

```powershell
& C:\Java\jdk-17\bin\java.exe -version
& C:\Java\jdk-21\bin\java.exe -version
```

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

## 每个 Tomcat 实例

Tomcat 启动时读 `JAVA_HOME`（或 `JRE_HOME`）。每个实例：

```bat
REM C:\apps\tomcat-a\bin\setenv.bat
set "JAVA_HOME=C:\Java\jdk-17"
set "CATALINA_BASE=C:\apps\tomcat-a"
```

```bat
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）。

## Windows 服务

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

```bat
tomcat10w.exe //ES//TomcatA
```

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

```powershell
Get-CimInstance Win32_Process -Filter "Name='java.exe'" |
  Select-Object ProcessId, CommandLine
```

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

## 验证应用，不只是 java -version

```powershell
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 行。

> **警告: 不要为修一个应用改全局 JAVA_HOME**
>
> 改机器级 `JAVA_HOME` 可能让所有 Java 服务下次重启全变。把版本固定在服务/实例里；全局值除非有意，不要动。

## 升级路径

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

## 实验室边界

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

## 来源

- [Microsoft Learn — 安装 OpenJDK](https://learn.microsoft.com/zh-cn/java/openjdk/install)
- [Apache Tomcat — Windows 服务](https://tomcat.apache.org/tomcat-10.1-doc/windows-service-howto.html)
- [Apache Tomcat — setenv](https://tomcat.apache.org/tomcat-10.1-doc/RUNNING.txt)

---

来源页面: https://winbook.fyi/zh/server/runtimes/java-multi-version/
