Releases: BaixuanZhu/jvm
Release list
v0.14.0
修复
- 修复 JDK 下载在连接停滞(对端不断开但不再传数据)时无限挂起的问题:下载
增加读停滞看门狗——距最后一次收到数据超过 30 秒即中断本次尝试并自动重试
(断点续传,已下载部分不丢)。大文件下载不设整体超时(避免慢网络误杀),
此前半死连接会让进度条原地卡死且永不报错;重试时也会显式打印
⚠️ 下载中断/停滞, Xs 后重试提示(原先静默退避)。
新增
-
jvm doctor新增 3 项检查(11 → 14 项):配置文件(config.toml 存在但
语法非法时显式报 ✗——此时 mirror/arch 等自定义项已静默回退默认,启动时的
一次性警告容易错过);临时目录残留(~/.jvm下.tmp-extract-*解压
半成品,安装中断遗留、白占磁盘,doctor --fix自动清理);下载缓存
(信息性汇报 zip 数量/占用/未完成分片,占用大或含.part时附
jvm cache clean释放提示)。 -
jvm available查询结果本地缓存(~/.jvm/available-cache.json,10 分钟有效):
二次查询不再实时打全部发行版 API,大幅提速。表格形态按发行版整表缓存;
-a/--major分组形态按distro@major逐组缓存、增量复用(只重查缺失或
过期的组,全量子版本列表这一最重查询收益最大)。查询失败的结果不落盘,
目标架构变化(arch配置)自动整体失效;-r/--refresh强制绕过缓存
直查。命中时输出会标注⚡ 缓存结果一行。 -
jvm update --all [-y]:一条命令升级全部落后的 (发行版, 大版本) 组——并发
检查与outdated同源,汇总打印各组升级计划后一次确认,逐组执行与单组
update完全相同的闭环(装新 → 条件切换 → 清理旧版)。某组失败不阻断
其余组,末尾给出成功/未处理汇总;存在失败或跳过组时以非零码退出,供
脚本感知。 -
Tab 补全覆盖扩展:
jvm exec补本地已装版本(仅--之前的版本槽,之后让位
给要执行的命令);available补-a/-m选项;doctor补--fix/-y;
init/completion补powershell/bash参数与--install。install
仅在版本槽补distro@前缀,本地 zip 路径槽让给 shell 默认文件补全。
补全块 token 递增至 v5,升级后首次启动自动刷新老 profile 块。
v0.13.0
新增
-
新发行版
temurin-ea(Temurin 早期访问版):跟踪尚未 GA 的大版本预览构建
(如jvm install temurin-ea@28/jvm available temurin-ea),EA 大版本
列表实时从 Adoptium API 归并(随上游滚动,无需升级 jvm)。版本形如
28+14-ea-beta,outdated/update对 EA 组照常工作(build 级升级)。
清华镜像不同步 EA 构建,下载直连 GitHub release 资产。 -
新发行版
graalvm(Oracle GraalVM,CPU LTS 线 21/25):jvm install graalvm@21/jvm available graalvm。直连 Oracle 官方 CDN(国内可直连,
无镜像),SHA256 走官方.sha256旁路校验;版本号形如21.0.12。
官方无 Windows ARM64 构建,arch=aarch64下会明确提示并建议改用
temurin/microsoft。GraalVM 创新线(25iN)与 CE 不在本版范围。 -
本地 zip 包安装:
jvm install <distro@版本> <zip文件路径>(如
jvm install temurin@21.0.5+11 D:\downloads\jdk.zip),适合内网/代理环境
手动下载后纳管。不访问网络、不做远程校验和校验(本地文件由用户负责),
安装后的目录命名与远程安装完全一致,use/uninstall/outdated等
命令照常工作。 -
下载缓存:安装包 zip 以
{distro}-{版本}.zip留存~/.jvm/cache/(随
install_dir走),卸载后重装同版本直接复用、不再重新下载(命中前先校验
完整性,损坏/篡改自动删除重新下载)。新命令jvm cache查看缓存条目与
占用,jvm cache clean清空(含中断残留的.zip.part)。 -
配置文件新增
install_dir键(环境变量JVM_INSTALL_DIR同效):把 JDK 安装
数据目录(versions/)重定向到其他盘(如D:\jdks),适合 C 盘空间紧张的
场景。控制面(config.toml、currentjunction、注册表 PATH/JAVA_HOME)
留在~/.jvm不动,无需任何迁移即生效;已装版本需手动搬到新目录,
jvm doctor检测到旧默认目录仍有版本时会给出搬迁提示。
v0.12.0
新增
-
jvm update <[distro@]大版本> [-y]:patch 升级一步到位——安装该大版本最新 patch
(组内已有最新版则跳过下载直接进入清理)、(当前正在使用该组版本时)自动切换
current、清理组内全部旧 patch 目录(被进程占用删不掉的跳过并提示稍后手动
uninstall)。仅接受大版本号;jvm upgrade仍只负责 jvm 自身更新,两者语义
分离。jvm outdated的升级提示同步改为引导jvm update。 -
jvm home:打印当前 JAVA_HOME 路径(~/.jvm/current,单行无装饰),与注册表
持久化的值一致且切换版本后不变,供 CI 脚本 / IDE 配置直接引用。
修复
- Tab 补全的子命令列表补齐
outdated/exec(引入补全时即遗漏),并新增
update/home的补全;jvm update <TAB>补全本地已装版本的
distro@大版本形式(update 仅接受大版本号)。
变更
- 补全块引入版本 token(
jvm-completion: v1)并纳入启动自举的版本化重写:
老用户 profile 里只有 marker 的旧补全块,下次运行 jvm 时自动重写为新内容
(与集成块 v2 同机制),覆盖jvm upgrade/ 安装器 / 手动换便携 zip 全部
更新途径。此前补全块只按 marker 存在性判断,内容变更后老用户需手动执行
jvm completion <shell> --install才能刷新。
v0.11.1
修复
- 修复 Temurin 2026-07 CPU 起四段式版本号(如
25.0.4.1+1)下jvm available
显示错误版本号(25.0.4+101)、照此jvm install报「API 返回 404」的问题。
根因是 Adoptium 的 semver 字段仍编码为三段(25.0.4+101.0.LTS,第 4 段被编码进
build 号),从 semver 反推的短版本号无法反查 API;现改为直接采用 API 顶层
release_name字段(剥jdk-前缀),保证显示的版本号可安装。影响
jvm available/available -a展示与jvm outdated的远端版本号,
老版本号(三段式)行为不变。
移除
- 移除发版后自动向
microsoft/winget-pkgs提交 manifest 更新 PR 的 CI job(0.10.0
引入,因暂不发布 winget 而移除;将来要上 winget 可从 git 历史找回 workflow 配置)。
v0.11.0
新增
jvm exec <[distro@]版本> -- <命令>:用指定版本在子进程环境里执行命令,不动全局
current junction(一次性多版本测试与 CI 脚本场景,如jvm exec 17 -- mvn test)。
无版本号时读.jvmrc再退到当前版本;只解析本地已装版本,不自动下载;
java/javac优先在该版本 bin 内解析(不依赖系统 PATH),批处理
(.bat/.cmd,如 mvn/gradlew)经cmd.exe /c分发,子进程退出码原样传播。jvm outdated:检查已装版本 patch 更新——按(发行版, 大版本)分组并发查各
provider 的LatestPatch,列出可升级行(如temurin@21 21.0.5+11 → 21.0.8+7)
并提示升级命令(不同 patch 为不同目录名,jvm install并列安装不冲突,无需
重装参数)。jvm doctor --fix:诊断报告后对失败项执行自动修复——目录结构 / current 链接
重建到最新已装版本(current 为非空普通目录时跳过,不删用户数据)/ JAVA_HOME /
shell 集成与补全注入 / 用户 PATH 补 current/bin;注册表 PATH 里的旧 JDK 残留
逐条 y/N 确认后移除(doctor --fix -y跳过确认)。同时新增第 10 项检查
「用户 PATH」(注册表用户 PATH 是否含 current/bin,原来只查进程 PATH)。.jvmrc目录自动切换:shell 集成脚本 v2(PowerShell 包装 prompt / bash 挂
PROMPT_COMMAND,双层缓存,目录与 rc 未变时零开销)在.jvmrc变化时自动执行
jvm use --auto—— cd 进含.jvmrc的目录自动切到该版本,cd 出去恢复切换前的
手动版本(~/.jvm/auto-state记基线,显式jvm use即新基线会清掉)。
默认开启,config.toml设autoswitch = false(或JVM_AUTOSWITCH=0)关闭;
集成块带版本 token,老用户升级 jvm 后由启动自举自动重写 profile 拿到新钩子。
v0.10.0
新增
- 项目级版本固定
.jvmrc:jvm pin [版本]写入当前目录的.jvmrc,
jvm use无参数时从当前目录逐级向上查找并读取(与 .nvmrc / .ruby-version
一致,支持 monorepo 子目录)。文件格式为一行[distro@]version(支持#
注释);版本解析链路完全复用现有ParseVersionSpec+ResolveVersion,
指定版本未安装时报错提示jvm install(不自动下载)。新增internal/pinrc
包;为把目录名转成 distro@version,导出junction.SplitDistro。 - 新增竞态检测:
make test-race(go test -race ./...)本地可用,CI 每次
push/PR 在单元测试后额外跑一遍 race,锁定cmd并发查询与provider注册表
等路径的正确性。 - 发版后自动向
microsoft/winget-pkgs提交 winget manifest 更新 PR(用官方
wingetcreate,内部自动 fork + 提 PR,双架构 x64/arm64 的 setup.exe)。需在仓库
Secrets 配置WINGET_PAT;首次需手动提交BaixuanZhu.jvm初始 manifest。
v0.9.0
新增
- 新增 Azul Zulu (
zulu@) 与 BellSoft Liberica (liberica@) 两个发行版 provider;
两者均支持 Windows x64 / ARM64 (Zulu 走 Azul Metadata API 两步查询取官方 sha256,
Liberica 走 BellSoft Product Discovery API + 官方 sha1)。 - 下载校验层支持多算法:
Asset契约由SHA256改为Checksum+ChecksumAlgo
(默认 sha256), 各 provider 按发行版官方提供的哈希校验 (Liberica 用 SHA1, 其余 SHA256);
internal/jdk的fileSHA256泛化为fileHash(path, algo)。 - paths 支持
JVM_HOME环境变量重定向根目录 (CI / 集成测试隔离文件副作用用); 新增
CI workflow (.github/workflows/ci.yml): push/PR 每次跑单元测试, 每周 schedule +
手动workflow_dispatch跑真实集成测试 (scripts/integration-test.sh, 全 5 发行版
install/use/list/doctor/uninstall); Makefile 新增testtarget。 - 本地开发构建不再污染环境:
make build/make run产物经 ldflags 注入
Bootstrap=off, 启动时不写用户 PATH / shell profile (发行风味用
make build-dist,installer/release/dist-all自动走它); 任何构建可用
JVM_NO_BOOTSTRAP=1强制关闭自举; 自身位于系统 Temp 目录 (如go run的
临时二进制) 时亦自动跳过自举。
v0.8.0
新增
- 发行产物新增 windows/arm64 架构: CI 打 tag 时同时产出
jvm-windows-arm64-setup.exe与jvm-windows-arm64.zip
(安装器 stub 为 x86, 在 ARM64 Windows 上靠系统内置模拟运行,
释放出的 jvm.exe 为 ARM64 原生)。本地交叉编译用make build GOARCH=arm64,
构建产物改为按架构分目录存放 (dist/<arch>/jvm.exe)。 install.ps1一键安装脚本自动检测系统架构 (x64 / ARM64),
下载匹配架构的便携 zip。- ARM64 版 jvm 默认下载 ARM64 (aarch64) 的 JDK (此前默认 x64, 需手动配置)。
- Microsoft Build of OpenJDK 支持下载 Windows ARM64 (aarch64) 构建
(11/17/21/25 全部 LTS; aka.ms 短链与 SHA256 旁路校验模式与 x64 一致)。 arch配置接受别名:amd64→x64、arm64→aarch64(统一走
app.NormArch规范化, 各 provider 行为一致)。
变更
- Provider 层新增
Configurable可选接口与provider.ConfigureAll统一分发
全局下载配置 (目标架构/镜像): provider 实现该接口即自动接入,
main.go 不再显式认识具体发行版适配器。 arch=aarch64时使用 Corretto 会明确报错并建议改用 temurin / microsoft
(Amazon Corretto 官方没有 Windows ARM64 构建; 此前会静默下载 x64 版
靠系统模拟运行, 用户无感知)。
v0.7.0
新增
- 启动时静默检查 jvm 新版本 (24 小时节流): 距上次检查超 24h 才查 GitHub
Release, 落后时提示运行jvm upgrade, 网络失败永不阻断主命令。 - JDK 下载支持瞬时错误重试 (3 次指数退避) 与 HTTP Range 断点续传: 下载中断
后下次jvm install从断点继续, 无需重下完整 zip。续传细节 (.part 文件)
封装在下载层内部, 编排层与自更新流程无感知。 jvm doctor新增三项诊断:java 版本: 实跑java -version, 排除 "文件存在但二进制损坏/缺 DLL"。版本目录完整性: 扫描~/.jvm/versions/各目录是否均有bin/java.exe,
标记解压中断的半成品。注册表 PATH 残留: 检查用户 PATH 里是否有非 current/bin 的旧 JDK 路径。
变更
- 导出
junction.MajorOf供 doctor 复用, 避免版本目录名解析逻辑重复。 app包新增CompareVersions/LatestGitHubTag共享基础设施,
供更新检查使用 (不引入新依赖)。