配置与原理

工作原理

~/.jvm/
  versions/               ← 解压后的 JDK({distro}-{版本} 命名;可用 install_dir 重定向)
    temurin-21.0.12+8/
    corretto-21.0.12.8.1/
  cache/                  ← 安装包 zip 缓存(重装免重下;jvm cache clean 清空)
  current/                ← junction,指向当前选中的版本
    bin/java.exe ...
  config.toml             ← 用户配置(可选,默认不存在)
  auto-state              ← .jvmrc 自动切换前的手动版本记录(可选存在)

当前终端即时生效则靠 shell 集成函数:jvm use 调用真正的 jvm.exe 后,由 wrapper 函数在会话内刷新 JAVA_HOMEPATH(子进程改不了父 shell 环境,靠函数绕过)。

.jvmrc 自动切换

shell 集成 v2 在每次出提示符前检查当前目录链上的 .jvmrc(双层缓存,目录与 rc 未变时零开销):

仅 PowerShell 与 Git Bash 支持自动切换(CMD 用户用无参数 jvm use 显式读取)。

配置文件(可选)

jvm 默认用清华镜像源下载 JDK,目标架构跟随 jvm 二进制本身(x64 版下 x64 JDK,ARM64 版下 aarch64 JDK),.jvmrc 自动切换默认开启。如需更改,在 ~/.jvm/config.toml 写:

# 下载镜像源(默认清华 TUNA,仅 Temurin 走镜像)。海外用户可改成官方或其他镜像。
mirror = "https://mirrors.tuna.tsinghua.edu.cn/Adoptium"

# 目标架构(默认跟随 jvm 二进制架构;也接受别名 amd64 / arm64)。
arch = "aarch64"

# .jvmrc 目录自动切换(默认 true,关掉后 cd 不再自动切换)。
autoswitch = false

# JDK 数据目录重定向(默认空 = ~/.jvm)。把 versions/ 与 cache/ 挪到其他盘,
# 适合 C 盘空间紧张的场景;控制面(本文件、current junction、注册表 PATH)
# 留在 ~/.jvm 不动。已装版本需手动搬到新目录,doctor 检测到旧目录有版本会提示。
install_dir = "D:\\jdks"

各发行版的 Windows ARM64 构建支持:

发行版 Windows ARM64 说明
Temurin ⚠️ 部分版本 Adoptium 官方覆盖不全(如 21 有、17/25 暂无),以实际查询为准
Temurin EA ⚠️ 同 Temurin 早期访问版走同一 Adoptium API,覆盖随上游滚动
Microsoft ✅ 全部 LTS 11 / 17 / 21 / 25 均有 ARM64 构建
Zulu ✅ LTS 11 / 17 / 21 / 25 均有 ARM64 构建
Liberica ✅ 全部 LTS 全架构覆盖
Corretto ❌ 没有 官方未发布;arch=aarch64 时会明确报错并建议改用 Temurin / Microsoft / Zulu / Liberica
GraalVM ❌ 没有 Oracle 官方无 Windows ARM64 构建;会明确报错并建议改用 Temurin / Microsoft

也可用环境变量临时覆盖(优先级高于配置文件):

$env:JVM_MIRROR = "https://your.mirror/Adoptium"
$env:JVM_ARCH = "aarch64"
$env:JVM_AUTOSWITCH = "0"       # 临时关闭 .jvmrc 自动切换
$env:JVM_INSTALL_DIR = "D:\jdks"
jvm install 21

优先级:环境变量 > 配置文件 > 默认值。不配置则全部用默认值,无需创建文件。

设计决策

问题 选择 原因
切换机制 Windows junction (reparse point) 免管理员权限、新终端也生效
junction 创建 原生 FSCTL_SET_REPARSE_POINT (syscall) 不调用 cmd.exe,无注入面
当前终端生效 启动时自动注入 shell wrapper 函数 子进程改不了父 shell 环境
.jvmrc 自动切换 包装 prompt (PS) / 挂 PROMPT_COMMAND (bash) + 双层缓存 出提示符前自然触发,目录与 rc 未变时零开销
PATH 持久化 注册表 HKCU\Environment + 广播 WM_SETTINGCHANGE 不用 setx(会截断长 PATH)
下载源 Temurin 清华镜像优先 → 官方 CDN 回退 国内快,且官方兜底
安全校验 下载强制按官方哈希校验(SHA256 / SHA1) 损坏/篡改即报错中止
下载稳健性 断点续传 + 读停滞看门狗(30 秒无数据自动中断重试) 半死连接不会无限挂起
JDK 存储 ~/.jvm(数据面可经 install_dir 重定向到其他盘) 控制面与数据面分离,重定向不动注册表
安装包缓存 zip 留存 cache/,命中校验后复用 卸载重装免重新下载