SDKMAN是Linux环境下一款SDK多版本管理工具,可以帮助我们管理SDK多个版本。在使用的过程中,经常会出现因为网络问题导致无法安装某些SDK或者某些SDK的特定版本的问题,这里简要介绍一下解决办法。
lwk@qwfys:~/.sdkman$ tree -d -L 3
.
├── archives
├── bin
├── candidates
│ ├── java
│ │ ├── 11.0.12-open
│ │ ├── 11.0.15-librca
│ │ ├── 17.0.3-librca
│ │ ├── 18.0.1.1-open
│ │ ├── 22.0.0.2.r11-grl
│ │ ├── 22.1.0.r17-grl
│ │ ├── 8.0.302-open
│ │ ├── 8.0.333-librca
│ │ └── current -> 8.0.333-librca
│ └── maven
│ ├── 3.8.5
│ ├── 3.8.6
│ └── current -> 3.8.6
├── contrib
│ └── completion
│ └── bash
├── etc
├── ext
├── src
├── tmp
│ └── out
└── var
└── metadata
27 directories
lwk@qwfys:~/.sdkman$
lwk@qwfys$ sdk list java
================================================================================
Available Java Versions for Linux 64bit
================================================================================
Vendor | Use | Version | Dist | Status | Identifier
--------------------------------------------------------------------------------
Corretto | | 18.0.1 | amzn | | 18.0.1-amzn
| | 17.0.3.6.1 | amzn | | 17.0.3.6.1-amzn
| | 17.0.0.35.1 | amzn | | 17.0.0.35.1-amzn
| | 11.0.15.9.1 | amzn | | 11.0.15.9.1-amzn
| | 11.0.12.7.1 | amzn | | 11.0.12.7.1-amzn
| | 8.332.08.1 | amzn | | 8.332.08.1-amzn
Dragonwell | | 11.0.12.8 | albba | | 11.0.12.8-albba
| | 8.8.9 | albba | | 8.8.9-albba
Gluon | | 22.1.0.1.r17 | gln | | 22.1.0.1.r17-gln
| | 22.1.0.1.r11 | gln | | 22.1.0.1.r11-gln
GraalVM | | 22.1.0.r17 | grl | installed | 22.1.0.r17-grl
| | 22.1.0.r11 | grl | | 22.1.0.r11-grl
| | 22.0.0.2.r17 | grl | | 22.0.0.2.r17-grl
| | 22.0.0.2.r11 | grl | installed | 22.0.0.2.r11-grl
| | 21.3.2.r17 | grl | | 21.3.2.r17-grl
| | 21.3.2.r11 | grl | | 21.3.2.r11-grl
| | 21.3.1.r8 | grl | | 21.3.1.r8-grl
| | 21.2.0.r8 | grl | | 21.2.0.r8-grl
| | 21.1.0.r8 | grl | | 21.1.0.r8-grl
| | 20.3.6.r11 | grl | | 20.3.6.r11-grl
| | 20.3.3.r8 | grl | | 20.3.3.r8-grl
| | 20.3.2.r8 | grl | | 20.3.2.r8-grl
| | 19.3.6.r11 | grl | | 19.3.6.r11-grl
| | 19.3.6.r8 | grl | | 19.3.6.r8-grl
Java.net | | 20.ea.2 | open | | 20.ea.2-open
| | 20.ea.1 | open | | 20.ea.1-open
| | 19.ea.27 | open | | 19.ea.27-open
| | 19.ea.26 | open | | 19.ea.26-open
| | 19.ea.25 | open | | 19.ea.25-open
| | 19.ea.1.pma | open | | 19.ea.1.pma-open
| | 18.0.1.1 | open | installed | 18.0.1.1-open
| | 11.0.12 | open | installed | 11.0.12-open
| | 11.0.11 | open | | 11.0.11-open
| | 11.0.10 | open | | 11.0.10-open
| | 11.0.2 | open | | 11.0.2-open
| | 8.0.302 | open | installed | 8.0.302-open
| | 8.0.292 | open | | 8.0.292-open
| | 8.0.282 | open | | 8.0.282-open
| | 8.0.265 | open | | 8.0.265-open
Liberica | | 18.0.1.1.fx | librca | | 18.0.1.1.fx-librca
| | 18.0.1.1 | librca | | 18.0.1.1-librca
| | 17.0.3.1.fx | librca | | 17.0.3.1.fx-librca
| | 17.0.3.1 | librca | | 17.0.3.1-librca
| | 17.0.3 | librca | local only | 17.0.3-librca
| | 11.0.15.fx | librca | | 11.0.15.fx-librca
| | 11.0.15.1.fx | librca | | 11.0.15.1.fx-librca
| | 11.0.15.1 | librca | | 11.0.15.1-librca
| | 11.0.15 | librca | local only | 11.0.15-librca
| | 8.0.333.fx | librca | | 8.0.333.fx-librca
| >>> | 8.0.333 | librca | installed | 8.0.333-librca
| | 8.0.332.fx | librca | | 8.0.332.fx-librca
Liberica NIK | | 22.1.r17 | nik | | 22.1.r17-nik
| | 22.1.r11 | nik | | 22.1.r11-nik
| | 22.0.0.2.r17 | nik | | 22.0.0.2.r17-nik
| | 22.0.0.2.r11 | nik | | 22.0.0.2.r11-nik
| | 21.3.2.r17 | nik | | 21.3.2.r17-nik
| | 21.3.2.r11 | nik | | 21.3.2.r11-nik
| | 21.2 | nik | | 21.2-nik
| | 21.1 | nik | | 21.1-nik
| | 21.0.0.2.r11 | nik | | 21.0.0.2.r11-nik
| | 21.0.0.2 | nik | | 21.0.0.2-nik
Mandrel | | 22.1.0.0.r17 | mandrel | | 22.1.0.0.r17-mandrel
| | 22.1.0.0.r11 | mandrel | | 22.1.0.0.r11-mandrel
| | 22.0.0.2.r17 | mandrel | | 22.0.0.2.r17-mandrel
| | 22.0.0.2.r11 | mandrel | | 22.0.0.2.r11-mandrel
| | 21.3.2.0.r17 | mandrel | | 21.3.2.0.r17-mandrel
| | 21.3.2.0.r11 | mandrel | | 21.3.2.0.r11-mandrel
| | 21.3.1.1.r17 | mandrel | | 21.3.1.1.r17-mandrel
| | 21.3.1.1.r11 | mandrel | | 21.3.1.1.r11-mandrel
| | 21.3.1.0.r17 | mandrel | | 21.3.1.0.r17-mandrel
| | 21.3.1.0.r11 | mandrel | | 21.3.1.0.r11-mandrel
| | 21.3.0.0 | mandrel | | 21.3.0.0-mandrel
| | 21.2.0.2 | mandrel | | 21.2.0.2-mandrel
| | 20.3.3.0 | mandrel | | 20.3.3.0-mandrel
Microsoft | | 17.0.3 | ms | | 17.0.3-ms
| | 11.0.15 | ms | | 11.0.15-ms
Oracle | | 18.0.1 | oracle | | 18.0.1-oracle
| | 17.0.3 | oracle | | 17.0.3-oracle
SapMachine | | 18.0.1.1 | sapmchn | | 18.0.1.1-sapmchn
| | 17.0.3 | sapmchn | | 17.0.3-sapmchn
| | 17.0.3.0.1 | sapmchn | | 17.0.3.0.1-sapmchn
| | 17.0.2 | sapmchn | | 17.0.2-sapmchn
| | 11.0.15 | sapmchn | | 11.0.15-sapmchn
| | 11.0.15.0.1 | sapmchn | | 11.0.15.0.1-sapmchn
| | 11.0.14 | sapmchn | | 11.0.14-sapmchn
| | 11.0.14.1 | sapmchn | | 11.0.14.1-sapmchn
Semeru | | 18.0.1.1 | sem | | 18.0.1.1-sem
| | 17.0.3 | sem | | 17.0.3-sem
| | 11.0.15 | sem | | 11.0.15-sem
| | 8.0.332 | sem | | 8.0.332-sem
Temurin | | 18.0.1 | tem | | 18.0.1-tem
| | 17.0.3 | tem | | 17.0.3-tem
| | 11.0.15 | tem | | 11.0.15-tem
| | 8.0.332 | tem | | 8.0.332-tem
Trava | | 11.0.9 | trava | | 11.0.9-trava
| | 8.0.232 | trava | | 8.0.232-trava
Zulu | | 18.0.1 | zulu | | 18.0.1-zulu
| | 18.0.1.fx | zulu | | 18.0.1.fx-zulu
| | 17.0.3 | zulu | | 17.0.3-zulu
| | 17.0.3.fx | zulu | | 17.0.3.fx-zulu
| | 11.0.15 | zulu | | 11.0.15-zulu
| | 11.0.15.fx | zulu | | 11.0.15.fx-zulu
| | 8.0.332 | zulu | | 8.0.332-zulu
| | 8.0.332.fx | zulu | | 8.0.332.fx-zulu
| | 7.0.342 | zulu | | 7.0.342-zulu
| | 6.0.119 | zulu | | 6.0.119-zulu
================================================================================
Omit Identifier to install default version 17.0.3-tem:
$ sdk install java
Use TAB completion to discover available versions
$ sdk install java [TAB]
Or install a specific version by Identifier:
$ sdk install java 17.0.3-tem
Hit Q to exit this list view
================================================================================
(END)
q
lwk@qwfys:~$
lwk@qwfys:~$ sdk list maven
================================================================================
Available Maven Versions
================================================================================
> * 3.8.6 3.3.3
* 3.8.5 3.3.1
3.8.4 3.2.5
3.8.3 3.2.3
3.8.2 3.2.2
3.8.1 3.2.1
3.6.3 3.1.1
3.6.2 3.1.0
3.6.1 3.0.5
3.6.0 3.0.4
3.5.4
3.5.3
3.5.2
3.5.0
3.3.9
================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
(END)
q
lwk@qwfys:~$
看到这里,我们发现了一个技巧,那就是目录{SDKMAN_HOME}/candidates中的文件结构是{SDK}/{VERSION}这样的形式,如果目标下面有多个版本,软链接current指向我们期望设置的当前版本。
比说,maven当前版本是3.8.6,那么目录{SDKMAN_HOME}/candidates/maven中的current就指向3.8.6这个目录,即:
lwk@qwfys:~/.sdkman/candidates/maven$ ll
total 16
drwxrwxr-x 4 lwk lwk 4096 Jun 24 10:56 ./
drwxrwxr-x 4 lwk lwk 4096 Jun 6 15:12 ../
drwxr-xr-x 6 lwk lwk 4096 Mar 5 11:30 3.8.5/
drwxr-xr-x 6 lwk lwk 4096 Jun 6 16:16 3.8.6/
lrwxrwxrwx 1 lwk lwk 5 Jun 24 10:56 current -> 3.8.6/
lwk@qwfys:~/.sdkman/candidates/maven$
同样的,Java当前版本是Liberica提供的JDK 8.0.33,代号8.0.333-librca,即
Liberica | >>> | 8.0.333 | librca | installed | 8.0.333-librca
那么目录{SDKMAN_HOME}/candidates/java中的current就指向8.0.333-librca这个目录,即:
lwk@qwfys:~/.sdkman/candidates/java$ ll
total 40
drwxrwxr-x 10 lwk lwk 4096 Jun 24 09:16 ./
drwxrwxr-x 4 lwk lwk 4096 Jun 6 15:12 ../
drwxrwxr-x 10 lwk lwk 4096 Jul 15 2021 11.0.12-open/
drwxrwxr-x 9 lwk lwk 4096 Apr 20 12:53 11.0.15-librca/
drwxrwxr-x 9 lwk lwk 4096 Apr 19 14:03 17.0.3-librca/
drwxrwxr-x 8 lwk lwk 4096 Jun 6 16:42 18.0.1.1-open/
drwxrwxr-x 10 lwk lwk 4096 Jun 8 17:46 22.0.0.2.r11-grl/
drwxrwxr-x 10 lwk lwk 4096 Jun 6 17:10 22.1.0.r17-grl/
drwxrwxr-x 9 lwk lwk 4096 Jul 16 2021 8.0.302-open/
drwx------ 9 lwk lwk 4096 May 31 18:43 8.0.333-librca/
lrwxrwxrwx 1 lwk lwk 14 Jun 24 09:16 current -> 8.0.333-librca/
lwk@qwfys:~/.sdkman/candidates/java$
如此以来,我们只要通过其他手段将目标SDK对应版本按照上述规律放到目录{SDKMAN_HOME}/candidates/{SDK}/{VERSION}中,并在目录{SDKMAN_HOME}/candidates中的文件结构是{SDK}中创建软链接,指向期待的版本即可。这种方式与直接使用命令
sdk {sdk} default {VERSION}
的效果是一样的。
举例说明,我现在想将Java SDK版本设置为8.0.332-zulu,用命令是
sdk java default 8.0.332-zulu
相当于在目录{SDKMAN_HOME}/candidates/java中,用软链接current指向了目录8.0.332-zulu,而8.0.332-zulu中则是zulu为我们提供的JDK的8.0.332版本。