sdkvm 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.en.md +123 -99
  2. package/README.md +124 -100
  3. package/dist/index.js +370 -89
  4. package/package.json +3 -2
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  中文 | [English](./README.en.md)
14
14
 
15
- 管理 **Java JDK**、**Go 工具链**、**Flutter SDK** 与 **Node.js 运行时**。
15
+ 管理 **Java JDK**、**Go 工具链**、**Flutter SDK**、**Node.js 运行时**与 **Apache Maven**。
16
16
 
17
17
  </div>
18
18
 
@@ -38,27 +38,28 @@
38
38
 
39
39
  `sdkvm` 用 Node.js 编写,负责多种语言 SDK 的安装、切换和卸载。
40
40
 
41
- | SDK | 来源 | 说明 |
42
- |---|---|---|
43
- | Java | [Temurin](https://adoptium.net/)、[Zulu](https://www.azul.com/downloads/)、[Corretto](https://aws.amazon.com/corretto/) | `lts` 当前为 8 / 11 / 17 / 21 / 25 |
44
- | Go | [go.dev](https://go.dev/dl/) | 全历史稳定版 |
45
- | Flutter | 官方发布清单 | stable / beta;macOS 双架构,Linux / Windows 仅 x64 |
46
- | Node.js | [nodejs.org/dist](https://nodejs.org/dist) | `lts`(当前 24 Krypton)/ `latest` / 按 major 线;npm 随版本切换 |
41
+ | SDK | 来源 | 说明 |
42
+ | ------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
43
+ | Java | [Temurin](https://adoptium.net/)、[Zulu](https://www.azul.com/downloads/)、[Corretto](https://aws.amazon.com/corretto/) | `lts` 当前为 8 / 11 / 17 / 21 / 25 |
44
+ | Go | [go.dev](https://go.dev/dl/) | 全历史稳定版 |
45
+ | Flutter | 官方发布清单 | stable / beta;macOS 双架构,Linux / Windows 仅 x64 |
46
+ | Node.js | [nodejs.org/dist](https://nodejs.org/dist) | `lts`(当前 24 Krypton)/ `latest` / 按 major 线;npm 随版本切换 |
47
+ | Maven | [Maven Central](https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/) | `3` / `3.9` / `latest` 取稳定版;预发布只能精确安装 |
47
48
 
48
49
  行为约定:
49
50
 
50
- - 各 SDK 目录隔离,`JAVA_HOME`、`GO_HOME`、`FLUTTER_HOME`、`NODE_HOME` 互不覆盖。
51
+ - 各 SDK 目录隔离,`JAVA_HOME`、`GO_HOME`、`FLUTTER_HOME`、`NODE_HOME`、`MAVEN_HOME` 互不覆盖。
51
52
  - `use` 只改一个符号链接(Windows 为 junction),不搬移已安装的文件。
52
- - 下载地址由官方 API 解析。Go、Flutter、Node.js 强制校验 SHA-256;Java 各源尽力校验。
53
- - Temurin、Go、Flutter、Node.js 可配置镜像。校验和仍取自官方清单。
53
+ - 下载地址由官方 API 解析。Go、Flutter、Node.js 强制校验 SHA-256;Maven 强制校验官方 SHA-512;Java 各源尽力校验。
54
+ - Temurin、Go、Flutter、Node.js、Maven 可配置镜像。校验和仍取自官方清单。
54
55
  - 新增语言只需实现一个厂商模块,见[开发](#开发)。
55
56
 
56
57
  ## 系统要求
57
58
 
58
- | 依赖 | 版本 | 说明 |
59
- |---|---|---|
60
- | Node.js | >= 18.15 | npm 安装需要本机 Node。脚本安装自带隔离运行时,不要求预先安装 |
61
- | 操作系统 | — | macOS(Apple Silicon / Intel)、主流 Linux、Windows 10+ |
59
+ | 依赖 | 版本 | 说明 |
60
+ | -------- | -------- | --------------------------------------------------------------------------------- |
61
+ | Node.js | >= 18.15 | npm 安装需要本机 Node。脚本安装自带隔离运行时,不要求预先安装 |
62
+ | 操作系统 | — | macOS(Apple Silicon / Intel)、主流 Linux、Windows 10+ |
62
63
  | 解压工具 | 系统自带 | macOS / Linux 用 `tar`;Windows 用 bsdtar,缺失时回退 PowerShell `Expand-Archive` |
63
64
 
64
65
  平台限制:
@@ -97,7 +98,7 @@ irm https://raw.githubusercontent.com/QInJ1995/sdkvm/main/install.ps1 | iex
97
98
 
98
99
  ```console
99
100
  $ sdkvm version
100
- 1.0.3
101
+ 1.0.4
101
102
  ```
102
103
 
103
104
  自定义数据根时,**必须在安装命令的环境里带上** `SDKVM_HOME`(`curl | sh` 不会读取 `~/.zshrc`):
@@ -128,16 +129,16 @@ bun add -g sdkvm
128
129
 
129
130
  ## 升级
130
131
 
131
- | 安装方式 | 命令 | 影响范围 |
132
- |---|---|---|
133
- | 脚本(推荐) | `sdkvm upgrade` | 只替换 `$SDKVM_HOME/cli`。runtime 与已安装的 SDK 保持不变 |
134
- | npm 等 | `npm update -g sdkvm` | 只更新 CLI。pnpm / yarn / bun 用各自的全局更新命令 |
132
+ | 安装方式 | 命令 | 影响范围 |
133
+ | ------------ | --------------------- | --------------------------------------------------------- |
134
+ | 脚本(推荐) | `sdkvm upgrade` | 只替换 `$SDKVM_HOME/cli`。runtime 与已安装的 SDK 保持不变 |
135
+ | npm 等 | `npm update -g sdkvm` | 只更新 CLI。pnpm / yarn / bun 用各自的全局更新命令 |
135
136
 
136
137
  数据目录与 CLI 升级无关。脚本安装也可以重新执行安装脚本。
137
138
 
138
139
  ## 快速开始
139
140
 
140
- Java 可用裸命令(与 `sdkvm java` 等价);Go / Flutter / Node 用子命令。
141
+ Java 可用裸命令(与 `sdkvm java` 等价);Go / Flutter / Node / Maven 用子命令。
141
142
 
142
143
  ```sh
143
144
  # 可选:国内加速(按 SDK 类型分别设置,互不影响)
@@ -145,6 +146,7 @@ sdkvm mirror use nju # Java Temurin
145
146
  sdkvm go mirror use nju
146
147
  sdkvm flutter mirror use nju
147
148
  sdkvm node mirror use nju
149
+ sdkvm maven mirror use aliyun
148
150
  sdkvm nrm use taobao # 仅影响 npm install,与上面的 mirror 无关
149
151
 
150
152
  # Java
@@ -167,6 +169,11 @@ sdkvm node install lts
167
169
  sdkvm node use 24
168
170
  node --version
169
171
 
172
+ # Maven(需要已有 JAVA_HOME)
173
+ sdkvm maven install 3.9
174
+ sdkvm maven use 3.9
175
+ mvn -version
176
+
170
177
  # 查看与卸载
171
178
  sdkvm current
172
179
  sdkvm java install 21 --vendor zulu
@@ -182,22 +189,22 @@ sdkvm uninstall zulu-21
182
189
 
183
190
  ## 命令参考
184
191
 
185
- Java 使用裸命令(`sdkvm install`)或 `sdkvm java`,两者等价。Go、Flutter、Node.js 分别使用 `sdkvm go`、`sdkvm flutter`、`sdkvm node`。
192
+ Java 使用裸命令(`sdkvm install`)或 `sdkvm java`,两者等价。Go、Flutter、Node.js、Maven 分别使用 `sdkvm go`、`sdkvm flutter`、`sdkvm node`、`sdkvm maven`。
186
193
 
187
194
  ### 命令速查
188
195
 
189
- | 命令 | 作用 |
190
- |---|---|
191
- | `sdkvm install <version>` | 安装 Java(等于 `sdkvm java install`) |
192
- | `sdkvm use <version>` | 切换当前 Java |
193
- | `sdkvm ls` / `sdkvm ls -r` | 列出已安装版本 / 可安装版本线 |
194
- | `sdkvm current` | 显示全部 SDK 的当前版本 |
195
- | `sdkvm uninstall <version>` | 卸载一个版本 |
196
+ | 命令 | 作用 |
197
+ | ------------------------------------------------- | -------------------------------------------------- |
198
+ | `sdkvm install <version>` | 安装 Java(等于 `sdkvm java install`) |
199
+ | `sdkvm use <version>` | 切换当前 Java |
200
+ | `sdkvm ls` / `sdkvm ls -r` | 列出已安装版本 / 可安装版本线 |
201
+ | `sdkvm current` | 显示全部 SDK 的当前版本 |
202
+ | `sdkvm uninstall <version>` | 卸载一个版本 |
196
203
  | `sdkvm mirror ls\|use\|current\|show\|set\|unset` | 管理 SDK 下载镜像站 / URL(安装包,不是 npm 包源) |
197
- | `sdkvm nrm ls\|use\|current\|add\|del\|test` | 管理用户级 npm registry(类似 nrm) |
198
- | `sdkvm java\|go\|flutter\|node …` | 各 SDK 的完整命令组 |
199
- | `sdkvm version` | 打印 CLI 版本(同 `sdkvm --version`) |
200
- | `sdkvm upgrade` | 升级 CLI。见[升级](#升级) |
204
+ | `sdkvm nrm ls\|use\|current\|add\|del\|test` | 管理用户级 npm registry(类似 nrm) |
205
+ | `sdkvm java\|go\|flutter\|node\|maven …` | 各 SDK 的完整命令组 |
206
+ | `sdkvm version` | 打印 CLI 版本(同 `sdkvm --version`) |
207
+ | `sdkvm upgrade` | 升级 CLI。见[升级](#升级) |
201
208
 
202
209
  版本写法:
203
210
 
@@ -206,6 +213,7 @@ sdkvm java install lts | 21 | 21.0.5 | 21.0.5+11 | zulu-21
206
213
  sdkvm go install latest | 1.24 | 1.24.5 | golang-1.24
207
214
  sdkvm flutter install latest | 3.47 | 3.47.5 | 3.49.0-0.1.pre | flutter-3.47
208
215
  sdkvm node install lts | latest | 22 | 22.20.0 | nodejs-22.20.0
216
+ sdkvm maven install latest | 3 | 3.9 | 3.9.9 | 4.0.0-rc-4 | maven-3.9
209
217
  ```
210
218
 
211
219
  ### `sdkvm install <version>`
@@ -221,16 +229,16 @@ sdkvm installed Temurin 21.0.12.1 → ~/.sdkvm/jdks/temurin-21.0.12.1
221
229
  sdkvm switch to it: sdkvm use 21
222
230
  ```
223
231
 
224
- | 选项 | 说明 |
225
- |---|---|
226
- | `--vendor <id>` | Java:`temurin`(默认)/ `zulu` / `corretto`。Go 为 `golang`,Flutter 为 `flutter`,Node.js 为 `nodejs` |
227
- | `--force` | 已安装时删除并重装。默认跳过已安装版本 |
232
+ | 选项 | 说明 |
233
+ | --------------- | ------------------------------------------------------------------------------------------------------- |
234
+ | `--vendor <id>` | Java:`temurin`(默认)/ `zulu` / `corretto`。Go 为 `golang`,Flutter 为 `flutter`,Node.js 为 `nodejs`,Maven 为 `maven` |
235
+ | `--force` | 已安装时删除并重装。默认跳过已安装版本 |
228
236
 
229
237
  校验失败或解压异常时,半成品目录和缓存会被清掉。下载超时是 60 秒无数据,不是总时长上限。
230
238
 
231
239
  ### `sdkvm use <version>`
232
240
 
233
- 在已安装版本中匹配,并更新对应的 `current-*` 链接与 `JAVA_HOME` / `GO_HOME` / `FLUTTER_HOME` / `NODE_HOME` / `PATH`。
241
+ 在已安装版本中匹配,并更新对应的 `current-*` 链接与 `JAVA_HOME` / `GO_HOME` / `FLUTTER_HOME` / `NODE_HOME` / `MAVEN_HOME` / `PATH`。
234
242
 
235
243
  ```sh
236
244
  sdkvm use 21
@@ -238,9 +246,10 @@ sdkvm use temurin-21.0.5+11
238
246
  sdkvm go use 1.24.5
239
247
  sdkvm flutter use 3.47.5
240
248
  sdkvm node use 22.20.0
249
+ sdkvm maven use 3.9
241
250
  ```
242
251
 
243
- macOS / Linux 上,首次 `use` 会向 shell 配置追加初始化块,重开终端或 `source ~/.zshrc` 后生效。之后的切换只改链接。IDE 需要重启才会读到新的环境变量。详见[切换机制](#切换机制)。
252
+ macOS / Linux 上,首次 `use` 会向 shell 配置追加初始化块,重开终端或 `source ~/.zshrc` 后生效。之后的切换只改链接。IDE 需要重启才会读到新的环境变量。Maven 需要 JDK:没有 `JAVA_HOME` 时会提示先 `sdkvm java use`。详见[切换机制](#切换机制)。
244
253
 
245
254
  ### `sdkvm ls`
246
255
 
@@ -280,6 +289,8 @@ flutter: flutter-3.47.5
280
289
  FLUTTER_HOME → ~/.sdkvm/flutters/flutter-3.47.5
281
290
  node: nodejs-22.20.0
282
291
  NODE_HOME → ~/.sdkvm/nodes/nodejs-22.20.0
292
+ maven: maven-3.9.9
293
+ MAVEN_HOME → ~/.sdkvm/mavens/maven-3.9.9
283
294
  ```
284
295
 
285
296
  ### `sdkvm uninstall <version>`
@@ -288,7 +299,7 @@ node: nodejs-22.20.0
288
299
 
289
300
  ### `sdkvm mirror`
290
301
 
291
- 按 SDK 类型管理**安装包下载镜像**(不是 npm 包源)。Java:`sdkvm mirror`;其余:`sdkvm go|flutter|node mirror`。作用域互不影响。
302
+ 按 SDK 类型管理**安装包下载镜像**(不是 npm 包源)。Java:`sdkvm mirror`;其余:`sdkvm go|flutter|node|maven mirror`。作用域互不影响。
292
303
 
293
304
  ```sh
294
305
  sdkvm mirror ls
@@ -297,11 +308,11 @@ sdkvm go mirror use aliyun
297
308
  sdkvm node mirror use official # 恢复该类型官方源
298
309
  ```
299
310
 
300
- | 动作 | 说明 |
301
- |---|---|
302
- | `ls` / `current` / `show` | 查看本类型可用站与当前配置 |
303
- | `use <site>` | 一键切换内置站(`nju` / `tuna` / `aliyun` / `huawei` / `official`) |
304
- | `set [vendor] <url>` / `unset` | 手填或清除 URL |
311
+ | 动作 | 说明 |
312
+ | ------------------------------ | ------------------------------------------------------------------- |
313
+ | `ls` / `current` / `show` | 查看本类型可用站与当前配置 |
314
+ | `use <site>` | 一键切换内置站(`nju` / `tuna` / `aliyun` / `huawei` / `official`) |
315
+ | `set [vendor] <url>` / `unset` | 手填或清除 URL |
305
316
 
306
317
  站点覆盖与手填示例见[镜像与 npm 源](#镜像与-npm-源)。
307
318
 
@@ -324,20 +335,21 @@ sdkvm nrm test
324
335
 
325
336
  `install`、`use`、`uninstall` 共用下表。未列出的组合会被拒绝并给出改写提示。
326
337
 
327
- | 语法 | Java | Go | Flutter | Node.js | 示例 |
328
- |---|---|---|---|---|---|
329
- | `<major>` | 该大版本最新补丁 | — | — | 该 major 最新 | `21`、`22` |
330
- | `<major.minor>` | — | 该 minor 线最新补丁 | stable 通道该 minor 线最新补丁 | — | `1.24`、`3.47` |
331
- | `lts` | 最新 LTS 大版本 | — | — | 最新 LTS 线(当前 24 Krypton) | `lts` |
332
- | `latest` | — | 最新稳定版 | stable 最新,不含 beta | 最新 Current | `latest` |
333
- | `<full-version>` | 精确版本或前缀 | 精确版本 | 精确版本,可含 prerelease | 精确版本 | `21.0.5+11`、`1.24.5`、`3.49.0-0.1.pre`、`22.20.0` |
334
- | `<vendor>-…` | 限定发行版 | 同左 | 同左 | 同左 | `zulu-21`、`golang-1.24`、`nodejs-22.20.0` |
338
+ | 语法 | Java | Go | Flutter | Node.js | Maven | 示例 |
339
+ | ---------------- | ---------------- | ------------------- | ------------------------------ | ------------------------------ | ------------------------------ | ----------------------------------------------------------------- |
340
+ | `<major>` | 该大版本最新补丁 | — | — | 该 major 最新 | 该 major 最新稳定版 | `21`、`22`、`3` |
341
+ | `<major.minor>` | — | 该 minor 线最新补丁 | stable 通道该 minor 线最新补丁 | — | 该 minor 线最新稳定版 | `1.24`、`3.47`、`3.9` |
342
+ | `lts` | 最新 LTS 大版本 | — | — | 最新 LTS 线(当前 24 Krypton) | — | `lts` |
343
+ | `latest` | — | 最新稳定版 | stable 最新,不含 beta | 最新 Current | 最高稳定版,不含预发布 | `latest` |
344
+ | `<full-version>` | 精确版本或前缀 | 精确版本 | 精确版本,可含 prerelease | 精确版本 | 精确版本,可含预发布 | `21.0.5+11`、`1.24.5`、`3.49.0-0.1.pre`、`22.20.0`、`4.0.0-rc-4` |
345
+ | `<vendor>-…` | 限定发行版 | 同左 | 同左 | 同左 | 同左 | `zulu-21`、`golang-1.24`、`nodejs-22.20.0`、`maven-3.9.9` |
335
346
 
336
347
  匹配规则:
337
348
 
338
- - `21`、`1.24`、`3.47`、`22` 匹配该线已安装或可安装的最新补丁。
339
- - Java 的 `21.0.5` 做前缀匹配,可以命中 `21.0.5+11`。Go、Flutter、Node.js 的精确版本按全串匹配。
349
+ - `21`、`1.24`、`3.47`、`22`、`3`、`3.9` 匹配该线已安装或可安装的最新补丁。
350
+ - Java 的 `21.0.5` 做前缀匹配,可以命中 `21.0.5+11`。Go、Flutter、Node.js、Maven 的精确版本按全串匹配。
340
351
  - Flutter 的 `latest` 与 `3.47` 只解析 stable。安装 beta 需要完整 prerelease,例如 `3.49.0-0.1.pre`。
352
+ - Maven 只收录 3.0 及以上的稳定版 `x.y.z`。`latest`、`3`、`3.9` 不含预发布;安装 `4.0.0-rc-4` 这类版本必须写完整串。Maven 没有 `lts`。
341
353
  - Java 的 `lts` 与 Adoptium 列表对齐,当前为 8 / 11 / 17 / 21 / 25。Node.js 的 `lts` 取官方 `index.json` 里最新带 LTS 代号的条目。
342
354
  - Node.js 不接受 `22.20` 这种两段式,应写成 `22` 或 `22.20.0`。
343
355
  - 省略厂商前缀时使用默认发行版。只有 Java 可以配置默认厂商,见[配置文件](#配置文件)。
@@ -354,10 +366,12 @@ sdkvm nrm test
354
366
  ├── gos/ # Go:golang-1.24.5
355
367
  ├── flutters/ # Flutter:flutter-3.47.5
356
368
  ├── nodes/ # Node.js:nodejs-22.20.0
369
+ ├── mavens/ # Maven:maven-3.9.9
357
370
  ├── current-java # JAVA_HOME 链接(Windows 为 junction)
358
371
  ├── current-go
359
372
  ├── current-flutter
360
373
  ├── current-node
374
+ ├── current-maven
361
375
  ├── runtime/ # 脚本安装的 CLI 运行时,与 current-node 隔离
362
376
  ├── cli/ # 脚本安装的 CLI 包
363
377
  ├── bin/ # 脚本安装的入口 sdkvm(需加入 PATH)
@@ -366,11 +380,11 @@ sdkvm nrm test
366
380
  └── tmp/ # 解压临时目录,同样会删除
367
381
  ```
368
382
 
369
- 解压后的大致体积:Java 约 300 MB,Go 约 250 MB,Node.js 约 100 MB(含捆绑 npm),Flutter 数 GB(压缩包约 1–2.2 GB)。
383
+ 解压后的大致体积:Java 约 300 MB,Go 约 250 MB,Node.js 约 100 MB(含捆绑 npm),Maven 约 10 MB,Flutter 数 GB(压缩包约 1–2.2 GB)。
370
384
 
371
385
  ### 切换机制
372
386
 
373
- macOS / Linux 上,`current-*` 是指向当前版本目录的符号链接。首次 `use` 会向 shell 配置追加带标记的块:zsh 写入 `~/.zshrc`,bash 写入 `~/.bash_profile` 或 `~/.bashrc`。四种 SDK 各一块。
387
+ macOS / Linux 上,`current-*` 是指向当前版本目录的符号链接。首次 `use` 会向 shell 配置追加带标记的块:zsh 写入 `~/.zshrc`,bash 写入 `~/.bash_profile` 或 `~/.bashrc`。五种 SDK 各一块。
374
388
 
375
389
  ```sh
376
390
  # >>> sdkvm java init >>>
@@ -392,11 +406,16 @@ case ":$PATH:" in *":$FLUTTER_HOME/bin:"*) ;; *) export PATH="$FLUTTER_HOME/bin:
392
406
  export NODE_HOME="$HOME/.sdkvm/current-node"
393
407
  case ":$PATH:" in *":$NODE_HOME/bin:"*) ;; *) export PATH="$NODE_HOME/bin:$PATH";; esac
394
408
  # <<< sdkvm node init <<<
409
+
410
+ # >>> sdkvm maven init >>>
411
+ export MAVEN_HOME="$HOME/.sdkvm/current-maven"
412
+ case ":$PATH:" in *":$MAVEN_HOME/bin:"*) ;; *) export PATH="$MAVEN_HOME/bin:$PATH";; esac
413
+ # <<< sdkvm maven init <<<
395
414
  ```
396
415
 
397
416
  环境变量指向链接。之后的 `use` 只改链接,新终端会读到新值。
398
417
 
399
- Windows 上,四个 `current-*` 都是 junction。`use` 把用户级环境变量写成 `REG_EXPAND_SZ`,保留 `%VAR%` 引用,避免 `setx` 的 1024 字符截断。PATH 追加 `%JAVA_HOME%\bin`、`%GO_HOME%\bin`、`%FLUTTER_HOME%\bin`。Node.js 的 Windows 归档没有 `bin/`,PATH 项是 `%NODE_HOME%` 本身。需要重开终端或重启 IDE。
418
+ Windows 上,五个 `current-*` 都是 junction。`use` 把用户级环境变量写成 `REG_EXPAND_SZ`,保留 `%VAR%` 引用,避免 `setx` 的 1024 字符截断。PATH 追加 `%JAVA_HOME%\bin`、`%GO_HOME%\bin`、`%FLUTTER_HOME%\bin`、`%MAVEN_HOME%\bin`。Node.js 的 Windows 归档没有 `bin/`,PATH 项是 `%NODE_HOME%` 本身。需要重开终端或重启 IDE。
400
419
 
401
420
  ## 配置
402
421
 
@@ -412,7 +431,8 @@ Windows 上,四个 `current-*` 都是 junction。`use` 把用户级环境变
412
431
  "temurin": "https://mirrors.nju.edu.cn/adoptium",
413
432
  "golang": "https://golang.google.cn/dl",
414
433
  "flutter": "https://mirror.nju.edu.cn/flutter/flutter_infra_release",
415
- "nodejs": "https://mirror.nju.edu.cn/nodejs-release"
434
+ "nodejs": "https://mirror.nju.edu.cn/nodejs-release",
435
+ "maven": "https://maven.aliyun.com/repository/central"
416
436
  },
417
437
  "npmRegistries": {
418
438
  "myprivate": "http://xxx/registry/"
@@ -420,23 +440,23 @@ Windows 上,四个 `current-*` 都是 junction。`use` 把用户级环境变
420
440
  }
421
441
  ```
422
442
 
423
- | 字段 | 说明 | 默认值 |
424
- |---|---|---|
425
- | `version` | schema 版本 | `1` |
426
- | `defaultVendor` | Java 省略厂商前缀时的发行版 | `"temurin"` |
427
- | `mirror` | 厂商 id 到镜像根 URL。id 在全部 SDK 中唯一 | `{}` |
428
- | `npmRegistries` | `sdkvm nrm add` 写入的自定义 npm 源 | `{}` |
443
+ | 字段 | 说明 | 默认值 |
444
+ | --------------- | ------------------------------------------ | ----------- |
445
+ | `version` | schema 版本 | `1` |
446
+ | `defaultVendor` | Java 省略厂商前缀时的发行版 | `"temurin"` |
447
+ | `mirror` | 厂商 id 到镜像根 URL。id 在全部 SDK 中唯一 | `{}` |
448
+ | `npmRegistries` | `sdkvm nrm add` 写入的自定义 npm 源 | `{}` |
429
449
 
430
450
  ### 环境变量
431
451
 
432
- | 变量 | 说明 |
433
- |---|---|
434
- | `SDKVM_HOME` | 数据根目录,默认 `~/.sdkvm` |
435
- | `SDKVM_MIRROR` | 临时镜像,优先级高于配置文件,不写入配置 |
436
- | `SDKVM_QUIET` | 非空时抑制 info 与 warn |
437
- | `SDKVM_NODE_DIST` | 安装脚本使用的 Node 发行根 URL |
452
+ | 变量 | 说明 |
453
+ | -------------------- | ------------------------------------------------------- |
454
+ | `SDKVM_HOME` | 数据根目录,默认 `~/.sdkvm` |
455
+ | `SDKVM_MIRROR` | 临时镜像,优先级高于配置文件,不写入配置 |
456
+ | `SDKVM_QUIET` | 非空时抑制 info 与 warn |
457
+ | `SDKVM_NODE_DIST` | 安装脚本使用的 Node 发行根 URL |
438
458
  | `SDKVM_RELEASE_BASE` | 安装脚本与 `sdkvm upgrade` 使用的 GitHub Release 根 URL |
439
- | `SDKVM_RUNTIME_NODE` | 安装脚本内置的 Node 版本,默认 `22.20.0` |
459
+ | `SDKVM_RUNTIME_NODE` | 安装脚本内置的 Node 版本,默认 `22.20.0` |
440
460
 
441
461
  镜像优先级:`SDKVM_MIRROR` > `config.mirror[<vendor>]` > 官方源。详见[镜像与 npm 源](#镜像与-npm-源)。
442
462
 
@@ -444,11 +464,11 @@ Windows 上,四个 `current-*` 都是 junction。`use` 把用户级环境变
444
464
 
445
465
  两套独立能力,不要混用:
446
466
 
447
- | | `sdkvm mirror` | `sdkvm nrm` |
448
- |---|---|---|
449
- | 改什么 | JDK / Go / Flutter / Node **安装包**下载地址 | **npm 包** registry |
450
- | 影响 | `sdkvm … install` | `npm install` |
451
- | 作用域 | 按 SDK 类型分别设置 | 用户级全局 |
467
+ | | `sdkvm mirror` | `sdkvm nrm` |
468
+ | ------ | -------------------------------------------- | ------------------- |
469
+ | 改什么 | JDK / Go / Flutter / Node / Maven **安装包**下载地址 | **npm 包** registry |
470
+ | 影响 | `sdkvm … install` | `npm install` |
471
+ | 作用域 | 按 SDK 类型分别设置 | 用户级全局 |
452
472
 
453
473
  ### SDK 安装包镜像
454
474
 
@@ -459,15 +479,16 @@ sdkvm mirror use nju
459
479
  sdkvm go mirror use nju
460
480
  sdkvm flutter mirror use nju
461
481
  sdkvm node mirror use nju
482
+ sdkvm maven mirror use aliyun
462
483
  ```
463
484
 
464
- | 站点 | Java (temurin) | Go | Flutter | Node.js |
465
- |---|---|---|---|---|
466
- | `nju` | ✓ | ✓ | ✓ | ✓ |
467
- | `tuna` | ✓ | — | ✓ | —(归档不全,未收录) |
468
- | `aliyun` | — | ✓ | — | ✓ |
469
- | `huawei` | — | — | — | ✓ |
470
- | `official` | 清空本类型 | 清空本类型 | 清空本类型 | 清空本类型 |
485
+ | 站点 | Java (temurin) | Go | Flutter | Node.js | Maven |
486
+ | ---------- | -------------- | ---------- | ---------- | --------------------- | ---------- |
487
+ | `nju` | ✓ | ✓ | ✓ | ✓ | — |
488
+ | `tuna` | ✓ | — | ✓ | —(归档不全,未收录) | — |
489
+ | `aliyun` | — | ✓ | — | ✓ | ✓ |
490
+ | `huawei` | — | — | — | ✓ | ✓ |
491
+ | `official` | 清空本类型 | 清空本类型 | 清空本类型 | 清空本类型 | 清空本类型 |
471
492
 
472
493
  手填 URL 或临时覆盖:
473
494
 
@@ -476,15 +497,16 @@ sdkvm go mirror set golang https://golang.google.cn/dl
476
497
  SDKVM_MIRROR=https://golang.google.cn/dl sdkvm go install 1.24
477
498
  ```
478
499
 
479
- 优先级:`SDKVM_MIRROR` > `config.mirror[<vendor>]` > 官方源。镜像只替换归档下载地址;版本元数据与校验和仍走官方 API。走镜像时若官方校验源不可达,安装会**硬失败**(避免无法核对的包被放行)。
500
+ 优先级:`SDKVM_MIRROR` > `config.mirror[<vendor>]` > 官方源。镜像只替换归档下载地址;版本元数据与校验和优先走官方 API。官方校验源不可达、且校验文件是归档旁路(Maven `.sha512`、Temurin `.json`)时,改拉镜像上的同一文件再核对。两边都拿不到,或哈希不一致,安装仍失败。
480
501
 
481
- | 厂商 | 说明 |
482
- |---|---|
483
- | Temurin | Adoptium 目录结构;已验证 [NJU](https://mirrors.nju.edu.cn/adoptium)、[TUNA](https://mirrors.tuna.tsinghua.edu.cn/Adoptium) |
484
- | Go | 文件名拼在根 URL 后;如 `nju` / `aliyun` |
485
- | Flutter | 桶前缀替换;已验证 [NJU](https://mirror.nju.edu.cn/flutter/flutter_infra_release)。不要用 `storage.flutter-io.cn`(无发布清单) |
486
- | Node.js | 前缀替换;已验证 [NJU](https://mirror.nju.edu.cn/nodejs-release)。不要用 TUNA nodejs-release(缺归档) |
487
- | Zulu、Corretto | 官方 CDN 直发,暂不支持镜像 |
502
+ | 厂商 | 说明 |
503
+ | -------------- | ------------------------------------------------------------------------------------------------------------------------------- |
504
+ | Temurin | Adoptium 目录结构;已验证 [NJU](https://mirrors.nju.edu.cn/adoptium)、[TUNA](https://mirrors.tuna.tsinghua.edu.cn/Adoptium) |
505
+ | Go | 文件名拼在根 URL 后;如 `nju` / `aliyun` |
506
+ | Flutter | 桶前缀替换;已验证 [NJU](https://mirror.nju.edu.cn/flutter/flutter_infra_release)。不要用 `storage.flutter-io.cn`(无发布清单) |
507
+ | Node.js | 前缀替换;已验证 [NJU](https://mirror.nju.edu.cn/nodejs-release)。不要用 TUNA nodejs-release(缺归档) |
508
+ | Maven | Central 路径前缀替换;已验证 [阿里云 central](https://maven.aliyun.com/repository/central)、[华为云 maven](https://repo.huaweicloud.com/repository/maven)。校验用官方 `.sha512` |
509
+ | Zulu、Corretto | 官方 CDN 直发,暂不支持镜像 |
488
510
 
489
511
  ### npm registry
490
512
 
@@ -496,8 +518,8 @@ sdkvm nrm test # 测延迟
496
518
 
497
519
  ## 安全性
498
520
 
499
- - 下载地址来自官方 API:Adoptium、Azul Metadata、Corretto、go.dev/dl、Flutter releases、nodejs.org/dist `index.json`。不抓取搜索页。
500
- - 归档按块计算 SHA-256。Go、Flutter、Node.js(官方 `SHASUMS256.txt`)校验失败即中止。Java 校验源不可达时:官方源警告并继续;**走镜像下载时硬失败**(避免无法核对的镜像包被放行)。
521
+ - 下载地址来自官方 API:Adoptium、Azul Metadata、Corretto、go.dev/dl、Flutter releases、nodejs.org/dist `index.json`、Maven Central `maven-metadata.xml`。不抓取搜索页。
522
+ - 归档按块计算 SHA-256。Go、Flutter、Node.js(官方 `SHASUMS256.txt`)校验失败即中止。Maven 再对落盘文件计算 SHA-512,对照 `.sha512`(Central 不提供 `.sha256`)。校验源不可达时:官方下载警告并继续;走镜像时先试官方旁路,失败再试镜像上的同一文件。两边都拿不到,或哈希不一致,安装失败。
501
523
  - 解压后检查单根目录和可执行文件,并且只解压到新的空目录。
502
524
  - 安装与 `sdkvm upgrade` 持有 `~/.sdkvm/.lock`,避免并发写互相覆盖。
503
525
 
@@ -520,7 +542,8 @@ set -gx JAVA_HOME $HOME/.sdkvm/current-java
520
542
  set -gx GO_HOME $HOME/.sdkvm/current-go
521
543
  set -gx FLUTTER_HOME $HOME/.sdkvm/current-flutter
522
544
  set -gx NODE_HOME $HOME/.sdkvm/current-node
523
- fish_add_path $JAVA_HOME/bin $GO_HOME/bin $FLUTTER_HOME/bin $NODE_HOME/bin
545
+ set -gx MAVEN_HOME $HOME/.sdkvm/current-maven
546
+ fish_add_path $JAVA_HOME/bin $GO_HOME/bin $FLUTTER_HOME/bin $NODE_HOME/bin $MAVEN_HOME/bin
524
547
  ```
525
548
 
526
549
  ### Flutter 下载慢或中断
@@ -565,17 +588,18 @@ rm -rf ~/.sdkvm/bin ~/.sdkvm/cli ~/.sdkvm/runtime
565
588
 
566
589
  Windows 对应删除 `%USERPROFILE%\.sdkvm\bin\sdkvm.cmd`,以及 `%USERPROFILE%\.sdkvm\cli` 与 `%USERPROFILE%\.sdkvm\runtime`,并从用户 PATH 移除 `%USERPROFILE%\.sdkvm\bin`。
567
590
 
568
- 确认不再需要已安装的 JDK、Go、Flutter、Node.js 之后,再删除数据目录:
591
+ 确认不再需要已安装的 JDK、Go、Flutter、Node.js、Maven 之后,再删除数据目录:
569
592
 
570
593
  ```sh
571
594
  rm -rf ~/.sdkvm
572
595
  ```
573
596
 
574
597
  同时删除 shell 配置里:
598
+
575
599
  - `# >>> sdkvm path >>>` … `# <<< sdkvm path <<<`
576
- - 各 SDK 的 `>>> sdkvm java|go|flutter|node init >>>` … `<<< … <<<`
600
+ - 各 SDK 的 `>>> sdkvm java|go|flutter|node|maven init >>>` … `<<< … <<<`
577
601
 
578
- Windows 还需要在系统设置中删除 `JAVA_HOME`、`GO_HOME`、`FLUTTER_HOME`、`NODE_HOME`,并从用户 PATH 移除 `%JAVA_HOME%\bin`、`%GO_HOME%\bin`、`%FLUTTER_HOME%\bin`、`%NODE_HOME%`。
602
+ Windows 还需要在系统设置中删除 `JAVA_HOME`、`GO_HOME`、`FLUTTER_HOME`、`NODE_HOME`、`MAVEN_HOME`,并从用户 PATH 移除 `%JAVA_HOME%\bin`、`%GO_HOME%\bin`、`%FLUTTER_HOME%\bin`、`%NODE_HOME%`、`%MAVEN_HOME%\bin`。
579
603
 
580
604
  ## 开发
581
605
 
@@ -593,8 +617,8 @@ npm run build
593
617
  src/
594
618
  ├── cli/ # install / use / ls / uninstall / mirror / nrm / upgrade
595
619
  ├── core/ # 版本解析、注册表、配置、文件锁
596
- ├── sdk/ # java / go / flutter / node 的目录、环境变量、版本语法
597
- ├── vendor/ # temurin / zulu / corretto / golang / flutter / nodejs 与镜像改写
620
+ ├── sdk/ # java / go / flutter / node / maven 的目录、环境变量、版本语法
621
+ ├── vendor/ # temurin / zulu / corretto / golang / flutter / nodejs / maven 与镜像改写
598
622
  ├── fs/ # 解压、目录归一化、链接
599
623
  ├── shell/ # rc 写入、Windows 注册表
600
624
  ├── net/ # fetch、流式下载、校验
@@ -605,4 +629,4 @@ src/
605
629
 
606
630
  ## 许可证
607
631
 
608
- [MIT](./LICENSE) © QINJIN
632
+ [MIT](./LICENSE) © 秦佬湿