sdkvm 1.0.2 → 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 +153 -122
  2. package/README.md +154 -123
  3. package/dist/index.js +385 -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
  平台限制:
@@ -69,22 +70,11 @@
69
70
 
70
71
  ## 安装
71
72
 
72
- ### npm、pnpm、yarn、bun
73
+ **推荐使用安装脚本**:无需本机预装 Node.js,CLI 自带隔离运行时,数据与入口都在 `SDKVM_HOME`(默认 `~/.sdkvm`)下,升级用 `sdkvm upgrade` 即可。
73
74
 
74
- 本机需要 Node.js >= 18.15。四条命令都从 npm registry 安装:
75
+ ### 安装脚本(推荐)
75
76
 
76
- ```sh
77
- npm install -g sdkvm
78
- pnpm add -g sdkvm
79
- yarn global add sdkvm
80
- bun add -g sdkvm
81
- ```
82
-
83
- 装好后 CLI 使用 `PATH` 上的 `node`。若之后切到 18.15 以前的 Node,CLI 会无法启动,切回较新版本即可。
84
-
85
- ### 安装脚本
86
-
87
- 不要求本机已经安装 Node.js。需要仓库已有带 `sdkvm.tgz` 与 `SHA256SUMS` 的 GitHub Release(打 `v*` tag 后由 CI 上传)。
77
+ 需要仓库已有带 `sdkvm.tgz` 与 `SHA256SUMS` 的 [GitHub Release](https://github.com/QInJ1995/sdkvm/releases)(打 `v*` tag 后由 CI 上传)。
88
78
 
89
79
  macOS / Linux:
90
80
 
@@ -100,37 +90,55 @@ irm https://raw.githubusercontent.com/QInJ1995/sdkvm/main/install.ps1 | iex
100
90
 
101
91
  脚本会:
102
92
 
103
- 1. 下载 Node.js 22.20.0 到 `~/.sdkvm/runtime`。它只启动 CLI,`sdkvm node use` 不会改到它。
104
- 2. 从 GitHub Release 下载 `sdkvm.tgz`,校验 SHA-256 后解压到 `~/.sdkvm/cli`。
105
- 3. 写入 `~/.sdkvm/bin/sdkvm`(Windows 为 `%USERPROFILE%\.sdkvm\bin\sdkvm.cmd`),并把该目录写入 shell 配置 / 用户 PATH(zsh→`~/.zshrc`,bash→`~/.bash_profile` 或 `~/.bashrc`)。重开终端或 `source` 对应 rc 后即可使用 `sdkvm`。
93
+ 1. 下载 Node.js 22.20.0 到 `$SDKVM_HOME/runtime`(仅启动 CLI,`sdkvm node use` 不会改到它)。
94
+ 2. 从 GitHub Release 下载 `sdkvm.tgz`,校验 SHA-256 后解压到 `$SDKVM_HOME/cli`。
95
+ 3. 写入 `$SDKVM_HOME/bin/sdkvm`(Windows 为 `%SDKVM_HOME%\bin\sdkvm.cmd`),并把该目录写入 shell 配置 / 用户 PATH(zsh→`~/.zshrc`,bash→`~/.bash_profile` 或 `~/.bashrc`)。
106
96
 
107
- 数据根与 CLI 一致:`SDKVM_HOME` 可覆盖,默认 `~/.sdkvm`。runtime 与 CLI 都落在该根下。国内可换下载前缀:
97
+ 装完后重开终端,或 `source` 对应 rc,再验证:
98
+
99
+ ```console
100
+ $ sdkvm version
101
+ 1.0.4
102
+ ```
103
+
104
+ 自定义数据根时,**必须在安装命令的环境里带上** `SDKVM_HOME`(`curl | sh` 不会读取 `~/.zshrc`):
105
+
106
+ ```sh
107
+ SDKVM_HOME=/Volumes/Develop/sdkvm \
108
+ curl -fsSL https://raw.githubusercontent.com/QInJ1995/sdkvm/main/install.sh | sh
109
+ ```
110
+
111
+ 国内可换下载前缀:
108
112
 
109
113
  ```sh
110
114
  SDKVM_NODE_DIST=https://npmmirror.com/mirrors/node \
111
115
  SDKVM_RELEASE_BASE=https://github.com/QInJ1995/sdkvm/releases \
112
- sh install.sh
116
+ curl -fsSL https://raw.githubusercontent.com/QInJ1995/sdkvm/main/install.sh | sh
113
117
  ```
114
118
 
115
- 验证:
119
+ ### npm / pnpm / yarn / bun(备选)
116
120
 
117
- ```console
118
- $ sdkvm version
119
- 1.0.1
121
+ 适合本机已有 Node.js >= 18.15、且希望用包管理器统一管理全局工具的场景。CLI 依赖 `PATH` 上的 `node`;若之后切到 18.15 以前的 Node,CLI 可能无法启动。
122
+
123
+ ```sh
124
+ npm install -g sdkvm
125
+ pnpm add -g sdkvm
126
+ yarn global add sdkvm
127
+ bun add -g sdkvm
120
128
  ```
121
129
 
122
130
  ## 升级
123
131
 
124
- | 安装方式 | 命令 | 影响范围 |
125
- |---|---|---|
126
- | npm | `npm update -g sdkvm` | 只更新 CLI。pnpm / yarn / bun 用各自的全局更新命令 |
127
- | 脚本 | `sdkvm upgrade` | 只替换 `~/.sdkvm/cli`。runtime 与已安装的 SDK 保持不变 |
132
+ | 安装方式 | 命令 | 影响范围 |
133
+ | ------------ | --------------------- | --------------------------------------------------------- |
134
+ | 脚本(推荐) | `sdkvm upgrade` | 只替换 `$SDKVM_HOME/cli`。runtime 与已安装的 SDK 保持不变 |
135
+ | npm 等 | `npm update -g sdkvm` | 只更新 CLI。pnpm / yarn / bun 用各自的全局更新命令 |
128
136
 
129
- 数据目录 `~/.sdkvm` 与 CLI 升级无关。脚本安装也可以重新执行安装脚本。
137
+ 数据目录与 CLI 升级无关。脚本安装也可以重新执行安装脚本。
130
138
 
131
139
  ## 快速开始
132
140
 
133
- Java 可用裸命令(与 `sdkvm java` 等价);Go / Flutter / Node 用子命令。
141
+ Java 可用裸命令(与 `sdkvm java` 等价);Go / Flutter / Node / Maven 用子命令。
134
142
 
135
143
  ```sh
136
144
  # 可选:国内加速(按 SDK 类型分别设置,互不影响)
@@ -138,6 +146,7 @@ sdkvm mirror use nju # Java Temurin
138
146
  sdkvm go mirror use nju
139
147
  sdkvm flutter mirror use nju
140
148
  sdkvm node mirror use nju
149
+ sdkvm maven mirror use aliyun
141
150
  sdkvm nrm use taobao # 仅影响 npm install,与上面的 mirror 无关
142
151
 
143
152
  # Java
@@ -160,6 +169,11 @@ sdkvm node install lts
160
169
  sdkvm node use 24
161
170
  node --version
162
171
 
172
+ # Maven(需要已有 JAVA_HOME)
173
+ sdkvm maven install 3.9
174
+ sdkvm maven use 3.9
175
+ mvn -version
176
+
163
177
  # 查看与卸载
164
178
  sdkvm current
165
179
  sdkvm java install 21 --vendor zulu
@@ -175,22 +189,22 @@ sdkvm uninstall zulu-21
175
189
 
176
190
  ## 命令参考
177
191
 
178
- 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`。
179
193
 
180
194
  ### 命令速查
181
195
 
182
- | 命令 | 作用 |
183
- |---|---|
184
- | `sdkvm install <version>` | 安装 Java(等于 `sdkvm java install`) |
185
- | `sdkvm use <version>` | 切换当前 Java |
186
- | `sdkvm ls` / `sdkvm ls -r` | 列出已安装版本 / 可安装版本线 |
187
- | `sdkvm current` | 显示全部 SDK 的当前版本 |
188
- | `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>` | 卸载一个版本 |
189
203
  | `sdkvm mirror ls\|use\|current\|show\|set\|unset` | 管理 SDK 下载镜像站 / URL(安装包,不是 npm 包源) |
190
- | `sdkvm nrm ls\|use\|current\|add\|del\|test` | 管理用户级 npm registry(类似 nrm) |
191
- | `sdkvm java\|go\|flutter\|node …` | 各 SDK 的完整命令组 |
192
- | `sdkvm version` | 打印 CLI 版本(同 `sdkvm --version`) |
193
- | `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。见[升级](#升级) |
194
208
 
195
209
  版本写法:
196
210
 
@@ -199,6 +213,7 @@ sdkvm java install lts | 21 | 21.0.5 | 21.0.5+11 | zulu-21
199
213
  sdkvm go install latest | 1.24 | 1.24.5 | golang-1.24
200
214
  sdkvm flutter install latest | 3.47 | 3.47.5 | 3.49.0-0.1.pre | flutter-3.47
201
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
202
217
  ```
203
218
 
204
219
  ### `sdkvm install <version>`
@@ -214,16 +229,16 @@ sdkvm installed Temurin 21.0.12.1 → ~/.sdkvm/jdks/temurin-21.0.12.1
214
229
  sdkvm switch to it: sdkvm use 21
215
230
  ```
216
231
 
217
- | 选项 | 说明 |
218
- |---|---|
219
- | `--vendor <id>` | Java:`temurin`(默认)/ `zulu` / `corretto`。Go 为 `golang`,Flutter 为 `flutter`,Node.js 为 `nodejs` |
220
- | `--force` | 已安装时删除并重装。默认跳过已安装版本 |
232
+ | 选项 | 说明 |
233
+ | --------------- | ------------------------------------------------------------------------------------------------------- |
234
+ | `--vendor <id>` | Java:`temurin`(默认)/ `zulu` / `corretto`。Go 为 `golang`,Flutter 为 `flutter`,Node.js 为 `nodejs`,Maven 为 `maven` |
235
+ | `--force` | 已安装时删除并重装。默认跳过已安装版本 |
221
236
 
222
237
  校验失败或解压异常时,半成品目录和缓存会被清掉。下载超时是 60 秒无数据,不是总时长上限。
223
238
 
224
239
  ### `sdkvm use <version>`
225
240
 
226
- 在已安装版本中匹配,并更新对应的 `current-*` 链接与 `JAVA_HOME` / `GO_HOME` / `FLUTTER_HOME` / `NODE_HOME` / `PATH`。
241
+ 在已安装版本中匹配,并更新对应的 `current-*` 链接与 `JAVA_HOME` / `GO_HOME` / `FLUTTER_HOME` / `NODE_HOME` / `MAVEN_HOME` / `PATH`。
227
242
 
228
243
  ```sh
229
244
  sdkvm use 21
@@ -231,9 +246,10 @@ sdkvm use temurin-21.0.5+11
231
246
  sdkvm go use 1.24.5
232
247
  sdkvm flutter use 3.47.5
233
248
  sdkvm node use 22.20.0
249
+ sdkvm maven use 3.9
234
250
  ```
235
251
 
236
- macOS / Linux 上,首次 `use` 会向 shell 配置追加初始化块,重开终端或 `source ~/.zshrc` 后生效。之后的切换只改链接。IDE 需要重启才会读到新的环境变量。详见[切换机制](#切换机制)。
252
+ macOS / Linux 上,首次 `use` 会向 shell 配置追加初始化块,重开终端或 `source ~/.zshrc` 后生效。之后的切换只改链接。IDE 需要重启才会读到新的环境变量。Maven 需要 JDK:没有 `JAVA_HOME` 时会提示先 `sdkvm java use`。详见[切换机制](#切换机制)。
237
253
 
238
254
  ### `sdkvm ls`
239
255
 
@@ -273,6 +289,8 @@ flutter: flutter-3.47.5
273
289
  FLUTTER_HOME → ~/.sdkvm/flutters/flutter-3.47.5
274
290
  node: nodejs-22.20.0
275
291
  NODE_HOME → ~/.sdkvm/nodes/nodejs-22.20.0
292
+ maven: maven-3.9.9
293
+ MAVEN_HOME → ~/.sdkvm/mavens/maven-3.9.9
276
294
  ```
277
295
 
278
296
  ### `sdkvm uninstall <version>`
@@ -281,7 +299,7 @@ node: nodejs-22.20.0
281
299
 
282
300
  ### `sdkvm mirror`
283
301
 
284
- 按 SDK 类型管理**安装包下载镜像**(不是 npm 包源)。Java:`sdkvm mirror`;其余:`sdkvm go|flutter|node mirror`。作用域互不影响。
302
+ 按 SDK 类型管理**安装包下载镜像**(不是 npm 包源)。Java:`sdkvm mirror`;其余:`sdkvm go|flutter|node|maven mirror`。作用域互不影响。
285
303
 
286
304
  ```sh
287
305
  sdkvm mirror ls
@@ -290,11 +308,11 @@ sdkvm go mirror use aliyun
290
308
  sdkvm node mirror use official # 恢复该类型官方源
291
309
  ```
292
310
 
293
- | 动作 | 说明 |
294
- |---|---|
295
- | `ls` / `current` / `show` | 查看本类型可用站与当前配置 |
296
- | `use <site>` | 一键切换内置站(`nju` / `tuna` / `aliyun` / `huawei` / `official`) |
297
- | `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 |
298
316
 
299
317
  站点覆盖与手填示例见[镜像与 npm 源](#镜像与-npm-源)。
300
318
 
@@ -317,20 +335,21 @@ sdkvm nrm test
317
335
 
318
336
  `install`、`use`、`uninstall` 共用下表。未列出的组合会被拒绝并给出改写提示。
319
337
 
320
- | 语法 | Java | Go | Flutter | Node.js | 示例 |
321
- |---|---|---|---|---|---|
322
- | `<major>` | 该大版本最新补丁 | — | — | 该 major 最新 | `21`、`22` |
323
- | `<major.minor>` | — | 该 minor 线最新补丁 | stable 通道该 minor 线最新补丁 | — | `1.24`、`3.47` |
324
- | `lts` | 最新 LTS 大版本 | — | — | 最新 LTS 线(当前 24 Krypton) | `lts` |
325
- | `latest` | — | 最新稳定版 | stable 最新,不含 beta | 最新 Current | `latest` |
326
- | `<full-version>` | 精确版本或前缀 | 精确版本 | 精确版本,可含 prerelease | 精确版本 | `21.0.5+11`、`1.24.5`、`3.49.0-0.1.pre`、`22.20.0` |
327
- | `<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` |
328
346
 
329
347
  匹配规则:
330
348
 
331
- - `21`、`1.24`、`3.47`、`22` 匹配该线已安装或可安装的最新补丁。
332
- - 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 的精确版本按全串匹配。
333
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`。
334
353
  - Java 的 `lts` 与 Adoptium 列表对齐,当前为 8 / 11 / 17 / 21 / 25。Node.js 的 `lts` 取官方 `index.json` 里最新带 LTS 代号的条目。
335
354
  - Node.js 不接受 `22.20` 这种两段式,应写成 `22` 或 `22.20.0`。
336
355
  - 省略厂商前缀时使用默认发行版。只有 Java 可以配置默认厂商,见[配置文件](#配置文件)。
@@ -347,10 +366,12 @@ sdkvm nrm test
347
366
  ├── gos/ # Go:golang-1.24.5
348
367
  ├── flutters/ # Flutter:flutter-3.47.5
349
368
  ├── nodes/ # Node.js:nodejs-22.20.0
369
+ ├── mavens/ # Maven:maven-3.9.9
350
370
  ├── current-java # JAVA_HOME 链接(Windows 为 junction)
351
371
  ├── current-go
352
372
  ├── current-flutter
353
373
  ├── current-node
374
+ ├── current-maven
354
375
  ├── runtime/ # 脚本安装的 CLI 运行时,与 current-node 隔离
355
376
  ├── cli/ # 脚本安装的 CLI 包
356
377
  ├── bin/ # 脚本安装的入口 sdkvm(需加入 PATH)
@@ -359,11 +380,11 @@ sdkvm nrm test
359
380
  └── tmp/ # 解压临时目录,同样会删除
360
381
  ```
361
382
 
362
- 解压后的大致体积: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)。
363
384
 
364
385
  ### 切换机制
365
386
 
366
- 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 各一块。
367
388
 
368
389
  ```sh
369
390
  # >>> sdkvm java init >>>
@@ -385,11 +406,16 @@ case ":$PATH:" in *":$FLUTTER_HOME/bin:"*) ;; *) export PATH="$FLUTTER_HOME/bin:
385
406
  export NODE_HOME="$HOME/.sdkvm/current-node"
386
407
  case ":$PATH:" in *":$NODE_HOME/bin:"*) ;; *) export PATH="$NODE_HOME/bin:$PATH";; esac
387
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 <<<
388
414
  ```
389
415
 
390
416
  环境变量指向链接。之后的 `use` 只改链接,新终端会读到新值。
391
417
 
392
- 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。
393
419
 
394
420
  ## 配置
395
421
 
@@ -405,7 +431,8 @@ Windows 上,四个 `current-*` 都是 junction。`use` 把用户级环境变
405
431
  "temurin": "https://mirrors.nju.edu.cn/adoptium",
406
432
  "golang": "https://golang.google.cn/dl",
407
433
  "flutter": "https://mirror.nju.edu.cn/flutter/flutter_infra_release",
408
- "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"
409
436
  },
410
437
  "npmRegistries": {
411
438
  "myprivate": "http://xxx/registry/"
@@ -413,23 +440,23 @@ Windows 上,四个 `current-*` 都是 junction。`use` 把用户级环境变
413
440
  }
414
441
  ```
415
442
 
416
- | 字段 | 说明 | 默认值 |
417
- |---|---|---|
418
- | `version` | schema 版本 | `1` |
419
- | `defaultVendor` | Java 省略厂商前缀时的发行版 | `"temurin"` |
420
- | `mirror` | 厂商 id 到镜像根 URL。id 在全部 SDK 中唯一 | `{}` |
421
- | `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 源 | `{}` |
422
449
 
423
450
  ### 环境变量
424
451
 
425
- | 变量 | 说明 |
426
- |---|---|
427
- | `SDKVM_HOME` | 数据根目录,默认 `~/.sdkvm` |
428
- | `SDKVM_MIRROR` | 临时镜像,优先级高于配置文件,不写入配置 |
429
- | `SDKVM_QUIET` | 非空时抑制 info 与 warn |
430
- | `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 |
431
458
  | `SDKVM_RELEASE_BASE` | 安装脚本与 `sdkvm upgrade` 使用的 GitHub Release 根 URL |
432
- | `SDKVM_RUNTIME_NODE` | 安装脚本内置的 Node 版本,默认 `22.20.0` |
459
+ | `SDKVM_RUNTIME_NODE` | 安装脚本内置的 Node 版本,默认 `22.20.0` |
433
460
 
434
461
  镜像优先级:`SDKVM_MIRROR` > `config.mirror[<vendor>]` > 官方源。详见[镜像与 npm 源](#镜像与-npm-源)。
435
462
 
@@ -437,11 +464,11 @@ Windows 上,四个 `current-*` 都是 junction。`use` 把用户级环境变
437
464
 
438
465
  两套独立能力,不要混用:
439
466
 
440
- | | `sdkvm mirror` | `sdkvm nrm` |
441
- |---|---|---|
442
- | 改什么 | JDK / Go / Flutter / Node **安装包**下载地址 | **npm 包** registry |
443
- | 影响 | `sdkvm … install` | `npm install` |
444
- | 作用域 | 按 SDK 类型分别设置 | 用户级全局 |
467
+ | | `sdkvm mirror` | `sdkvm nrm` |
468
+ | ------ | -------------------------------------------- | ------------------- |
469
+ | 改什么 | JDK / Go / Flutter / Node / Maven **安装包**下载地址 | **npm 包** registry |
470
+ | 影响 | `sdkvm … install` | `npm install` |
471
+ | 作用域 | 按 SDK 类型分别设置 | 用户级全局 |
445
472
 
446
473
  ### SDK 安装包镜像
447
474
 
@@ -452,15 +479,16 @@ sdkvm mirror use nju
452
479
  sdkvm go mirror use nju
453
480
  sdkvm flutter mirror use nju
454
481
  sdkvm node mirror use nju
482
+ sdkvm maven mirror use aliyun
455
483
  ```
456
484
 
457
- | 站点 | Java (temurin) | Go | Flutter | Node.js |
458
- |---|---|---|---|---|
459
- | `nju` | ✓ | ✓ | ✓ | ✓ |
460
- | `tuna` | ✓ | — | ✓ | —(归档不全,未收录) |
461
- | `aliyun` | — | ✓ | — | ✓ |
462
- | `huawei` | — | — | — | ✓ |
463
- | `official` | 清空本类型 | 清空本类型 | 清空本类型 | 清空本类型 |
485
+ | 站点 | Java (temurin) | Go | Flutter | Node.js | Maven |
486
+ | ---------- | -------------- | ---------- | ---------- | --------------------- | ---------- |
487
+ | `nju` | ✓ | ✓ | ✓ | ✓ | — |
488
+ | `tuna` | ✓ | — | ✓ | —(归档不全,未收录) | — |
489
+ | `aliyun` | — | ✓ | — | ✓ | ✓ |
490
+ | `huawei` | — | — | — | ✓ | ✓ |
491
+ | `official` | 清空本类型 | 清空本类型 | 清空本类型 | 清空本类型 | 清空本类型 |
464
492
 
465
493
  手填 URL 或临时覆盖:
466
494
 
@@ -469,15 +497,16 @@ sdkvm go mirror set golang https://golang.google.cn/dl
469
497
  SDKVM_MIRROR=https://golang.google.cn/dl sdkvm go install 1.24
470
498
  ```
471
499
 
472
- 优先级:`SDKVM_MIRROR` > `config.mirror[<vendor>]` > 官方源。镜像只替换归档下载地址;版本元数据与校验和仍走官方 API。走镜像时若官方校验源不可达,安装会**硬失败**(避免无法核对的包被放行)。
500
+ 优先级:`SDKVM_MIRROR` > `config.mirror[<vendor>]` > 官方源。镜像只替换归档下载地址;版本元数据与校验和优先走官方 API。官方校验源不可达、且校验文件是归档旁路(Maven `.sha512`、Temurin `.json`)时,改拉镜像上的同一文件再核对。两边都拿不到,或哈希不一致,安装仍失败。
473
501
 
474
- | 厂商 | 说明 |
475
- |---|---|
476
- | Temurin | Adoptium 目录结构;已验证 [NJU](https://mirrors.nju.edu.cn/adoptium)、[TUNA](https://mirrors.tuna.tsinghua.edu.cn/Adoptium) |
477
- | Go | 文件名拼在根 URL 后;如 `nju` / `aliyun` |
478
- | Flutter | 桶前缀替换;已验证 [NJU](https://mirror.nju.edu.cn/flutter/flutter_infra_release)。不要用 `storage.flutter-io.cn`(无发布清单) |
479
- | Node.js | 前缀替换;已验证 [NJU](https://mirror.nju.edu.cn/nodejs-release)。不要用 TUNA nodejs-release(缺归档) |
480
- | 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 直发,暂不支持镜像 |
481
510
 
482
511
  ### npm registry
483
512
 
@@ -489,8 +518,8 @@ sdkvm nrm test # 测延迟
489
518
 
490
519
  ## 安全性
491
520
 
492
- - 下载地址来自官方 API:Adoptium、Azul Metadata、Corretto、go.dev/dl、Flutter releases、nodejs.org/dist `index.json`。不抓取搜索页。
493
- - 归档按块计算 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`)。校验源不可达时:官方下载警告并继续;走镜像时先试官方旁路,失败再试镜像上的同一文件。两边都拿不到,或哈希不一致,安装失败。
494
523
  - 解压后检查单根目录和可执行文件,并且只解压到新的空目录。
495
524
  - 安装与 `sdkvm upgrade` 持有 `~/.sdkvm/.lock`,避免并发写互相覆盖。
496
525
 
@@ -513,7 +542,8 @@ set -gx JAVA_HOME $HOME/.sdkvm/current-java
513
542
  set -gx GO_HOME $HOME/.sdkvm/current-go
514
543
  set -gx FLUTTER_HOME $HOME/.sdkvm/current-flutter
515
544
  set -gx NODE_HOME $HOME/.sdkvm/current-node
516
- 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
517
547
  ```
518
548
 
519
549
  ### Flutter 下载慢或中断
@@ -558,17 +588,18 @@ rm -rf ~/.sdkvm/bin ~/.sdkvm/cli ~/.sdkvm/runtime
558
588
 
559
589
  Windows 对应删除 `%USERPROFILE%\.sdkvm\bin\sdkvm.cmd`,以及 `%USERPROFILE%\.sdkvm\cli` 与 `%USERPROFILE%\.sdkvm\runtime`,并从用户 PATH 移除 `%USERPROFILE%\.sdkvm\bin`。
560
590
 
561
- 确认不再需要已安装的 JDK、Go、Flutter、Node.js 之后,再删除数据目录:
591
+ 确认不再需要已安装的 JDK、Go、Flutter、Node.js、Maven 之后,再删除数据目录:
562
592
 
563
593
  ```sh
564
594
  rm -rf ~/.sdkvm
565
595
  ```
566
596
 
567
597
  同时删除 shell 配置里:
598
+
568
599
  - `# >>> sdkvm path >>>` … `# <<< sdkvm path <<<`
569
- - 各 SDK 的 `>>> sdkvm java|go|flutter|node init >>>` … `<<< … <<<`
600
+ - 各 SDK 的 `>>> sdkvm java|go|flutter|node|maven init >>>` … `<<< … <<<`
570
601
 
571
- 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`。
572
603
 
573
604
  ## 开发
574
605
 
@@ -586,8 +617,8 @@ npm run build
586
617
  src/
587
618
  ├── cli/ # install / use / ls / uninstall / mirror / nrm / upgrade
588
619
  ├── core/ # 版本解析、注册表、配置、文件锁
589
- ├── sdk/ # java / go / flutter / node 的目录、环境变量、版本语法
590
- ├── vendor/ # temurin / zulu / corretto / golang / flutter / nodejs 与镜像改写
620
+ ├── sdk/ # java / go / flutter / node / maven 的目录、环境变量、版本语法
621
+ ├── vendor/ # temurin / zulu / corretto / golang / flutter / nodejs / maven 与镜像改写
591
622
  ├── fs/ # 解压、目录归一化、链接
592
623
  ├── shell/ # rc 写入、Windows 注册表
593
624
  ├── net/ # fetch、流式下载、校验
@@ -598,4 +629,4 @@ src/
598
629
 
599
630
  ## 许可证
600
631
 
601
- [MIT](./LICENSE) © QINJIN
632
+ [MIT](./LICENSE) © 秦佬湿