概述
官网,SDKMAN是一款管理多版本SDK的工具,可以实现在多个版本间的快速切换。
其他特性:
- 易用:安装SDK不再需要去Google想安装的某个软件的官网的下载页,或找其他下载页面,然后下载安装包、解压、设置环境变量等等繁琐操作
- 多平台:支持包括Windows在内的所有主要操作系统:Mac OSX,Linux,Cygwin,Solaris和FreeBSD。在Windows安装时,需要一个Shell执行环境,可使用Git Bash(应该没有哪个开发者说TA没安装好Git)、PowerShell(系统自带,界面不太好看)、PowerShell Core(需要手动安装)、WSL(Windows Subsystem for Linux)等。
- 全套JAVA支持:提供Java,Groovy,Scala,Kotlin和Ceylon等JVM工具包。 Ant,Gradle,Grails,Maven,SBT,Spark,Spring Boot,Vert.x等框架或工具集。
- API:使用开放的Broker REST API可以轻松地编写新的客户端,供应商可以通过安全的供应商API发布自己的版本。
- 轻量:只需要unzip、zip、curl、sed四个依赖命令(安装过程会检查这些依赖命令工具集,如果没有会提示安装),就可以在bash中通过命令使用,还可和ZSH一起使用。
安装
Mac安装SDKMAN!,安装成功后即可使用sdk
命令:
curl -s "https://get.sdkman.io" | bash
# 根据提示执行
source "/Users/johnny/.sdkman/bin/sdkman-init.sh"
# 验证
sdk version
安装过程中的部分输出:
Looking for a previous installation of SDKMAN...
Looking for unzip...
Looking for zip...
Looking for curl...
Looking for sed...
Set version to 5.18.2 ...
Set native version to 0.4.6 ...
Attempt update of login bash profile on OSX...
Added sdkman init snippet to /Users/johnny/.bash_profile
Attempt update of zsh profile...
Updated existing /Users/johnny/.zshrc
You are subscribed to the STABLE channel.
Please open a new terminal, or run the following in the existing one:
source "/Users/johnny/.sdkman/bin/sdkman-init.sh"
打开~/.bash_profile
文件看看cat ~/.bash_profile
:
#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"
可知是把sdkman-init.sh
脚本追加到~/.bash_profile
,关于此脚本,后文再谈。
输入命令sdk list jdk
报错提示:Stop! jdk is not a valid candidate.
。
Candidate是SDKMAN!使用的一个概念,输入sdk list
列举所有的Candidate,输出省略。比如java
就是一个Candidate,jdk
则不是。
sdk list
输出的文本过长,需要翻页才能找到想要查看的内容。此时可以考虑使用管道符。sdk
当然也支持grep
过滤:sdk list | grep neo4j
,输出:
Neo4j-Migrations (2.10.0) https://neo4j.com/labs/neo4j-migrations/
$ sdk install neo4jmigrations
列出可用的Java版本:sdk list java
,输出(省略大段内容):
Available Java Versions for macOS ARM 64bit
=============================================================================
Vendor | Use | Version | Dist | Status | Identifier
--------------------------------------------------------------------------
Gluon | | 22.1.0.1.r17 | gln | | 22.1.0.1.r17-gln
GraalVM CE | | 22 | graalce | | 22-graalce
| | 22.0.1 | graalce | | 22.0.1-graalce
第一列Vendor表示发行商,这里有我们最熟悉的Oracle、Zulu(即OpenJDK),还有JetBrains、GraalVM等。Version是大版本号,和目前JDK的发行版本号规则一致;每年发布2次,每半年发布一次,分别是3月和9月。最后一列Identifier是全局唯一标志符。通过Identifier来指定想要安装的某个Candidate的某个发行商的某个版本。
安装命令:sdk install <candidate> <Identifier>
。比如想安装GraalVM这种JDK:sdk install java 22.0.1-graalce
不同Candidate,其sdk list
输出不尽相同,如sdk list maven
输出就很精简,只有一个版本号,安装maven:sdk install maven 3.9.6
,输出:
Downloading: maven 3.9.6
In progress...
###################### 100.0%
Installing: maven 3.9.6
Done installing!
Setting maven 3.9.6 as default.
再安装另一个版本的maven:sdk install maven 3.8.1
,输出:
省略同上类似文本
Setting maven 3.8.1 as default.
也就是说,后安装的maven,会作为生效的,使用中的版本,即default
。
默认情况下,sdkman安装在目录~/.sdkman/
下。打开此隐藏目录open ~/.sdkman/
,会发现有个candidates
,candidates
目录下有刚安装的maven:
会发现maven下除了已经安装的两个版本的文件夹外,还有个current目录,并且是个软链接。再细心看,得知其标题是3.8.1,也就是说current指向3.8.1文件夹,因为后执行命令安装此版本。通过ls
命令验证一下:
切换到maven 3.9.6版本:sdk default maven 3.9.6
,输出setting maven 3.9.6 as the default version for all shells.
。再次查看Finder窗口或ls命令可得到验证,略。用mvn -v
命令来验证,输出:
Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)
Maven home: /Users/johnny/.sdkman/candidates/maven/current
Java version: 17.0.10, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
Default locale: zh_CN_#Hans, platform encoding: UTF-8
OS name: "mac os x", version: "13.0", arch: "aarch64", family: "mac"
sdk default
的设置是全局生效的。
如果不想设置默认版本(全局生效的版本),仅仅是临时使用某个版本,可使用命令:sdk use maven 3.9.6
。值得注意的是,这个命令的有效期仅限于此bash会话窗口,即此Shell session。如果在另外一个之前提前打开的bash窗口里执行命令mvn -v
,其输出就不一定是3.9.6。
目录
上面的截图显示有如下子目录:
- bin:仅有一个
sdkman-init.sh
脚本 - candidates:安装的软件包
- contrib:提供bash completion补全功能
- etc:仅有一个config文件,配置文件
- ext:空,暂时没用到
- libexec:包含version、default、help、home、uninstall5个命令
- src:存放sh脚本文件,
- tmp:临时目录
- var:
卸载
卸载软件包
执行命令sdk uninstall maven 3.8.1
即可。
卸载sdkman
上面提到,sdkman所有软件都安装在隐藏文件夹~/.sdkman
下,因此卸载命令可以是简单的删除并清空rm -rf ~/.sdkman
。
如果需要备份,则可以执行命令tar zcvf ~/sdkman-backup_$(date +%F-%kh%M).tar.gz -C ~/.sdkman
。
另外,安装过程中把sdkman-init.sh
脚本追加到~/.bash_profile
文件。卸载时,也最好更新一下~/.bash_profile
文件。
其他
命令
查看当前使用的版本:sdk current java
升级某个软件包,意义不大:sdk upgrade maven
升级SDKMAN!:sdk selfupdate
强制重新安装:sdk selfupdate force
离线模式
当电脑没有网时,离线模式会进行自动切换。支持手动切换:
sdk offline enable
sdk offline disable
Beta channel
上面的安装过程中的输出显示You are subscribed to the STABLE channel.
我们使用的是稳定版本。查看官网得知还有一个Bate版,包含cli一些可能不稳定的新功能,如果想使用Bate版本,需修改~/.sdkman/etc/config
文件:sdkman_beta_channel=true
。然后打开一个终端执行:sdk selfupdate force
。
参考
- 官网