认识 SDKMAN!
SDKMan 是一个开源的软件包管理工具,用于管理和切换不同版本的虚拟机(VM)类语言包,例如 Java、Groovy、Scala、Kotlin 等。它旨在简化在 Linux/Unix 系统上同时安装和切换多个语言版本的过程。
SDKMan 的主要功能包括:
- 安装和管理多个版本:SDKMan 允许用户轻松地安装和管理多个版本的虚拟机语言包。您可以使用 SDKMan 安装不同版本的 Java、Groovy、Scala 等语言,而无需手动处理版本冲突或环境变量设置。
- 版本切换:SDKMan 提供了一个简单的命令行界面,使用户可以方便地在不同的语言版本之间进行切换。您可以通过简单的命令来激活所需的语言版本,从而轻松地在不同的项目中使用不同的语言环境。
- 插件和扩展:SDKMan 支持插件和扩展,可以根据特定需求进行定制和扩展。您可以安装额外的插件来增加功能,或针对特定语言包进行扩展。
- 简化的命令行界面:SDKMan 提供了一个简洁而易用的命令行界面,使用户可以直接从终端执行各种操作,例如安装、切换、列出可用版本等。
系统环境
SDKMAN! 主要支持在 Linux 和 Unix 系统上管理和切换多个版本的虚拟机(VM)类语言包。具体而言,它可以在以下环境中使用:
- Linux 发行版:SDKMAN! 可以在各种 Linux 发行版上使用,包括但不限于 Ubuntu、Debian、Fedora、CentOS、Arch Linux 等。
- Unix 系统:SDKMAN! 也可以在一些 Unix 系统上使用,例如 macOS(基于 BSD)和 Solaris。
- 虚拟机语言包:SDKMAN! 提供对多个虚拟机语言包的支持,包括但不限于以下语言:
-
- Java:包括 OpenJDK 和 Oracle JDK。
- Groovy:用于 JVM 上的动态编程语言。
- Scala:一种运行在 Java 虚拟机上的静态类型编程语言。
- Kotlin:一种基于 JVM 的现代编程语言。
- Grails:用于构建基于 Groovy 的 Web 应用程序的框架。
- Gradle:用于构建和自动化构建过程的构建工具。
- Windows 系统:对于 Windows 系统,需要借助 WSL 使用。
JDK 支持列表
- Bisheng -Huawei
- Corretto -Amazon
- Dragonwell -Alibaba
- GraalVM -Oracle
- GraalVM -GraalVM Community
- Java SE Development Kit -Oracle
- Kona -Tencent
- Liberica -Bellsoft
- Liberica NIK -Bellsoft
- Mandrel -Red Hat
- OpenJDK -jdk.java.net
- OpenJDK -Microsoft
- SapMachine -SAP
- Semeru -IBM
- Temurin -Eclipse
- Trava -Trava
- Zulu -Azul Systems
SDK 支持列表
- Apache ActiveMQ (Classic)
- Ant
- AsciidoctorJ
- Ballerina
- Bld
- Bpipe
- BTrace
- Concurnas
- ConnOR
- Coursier
- CUBA CLI
- CXF
- Detekt
- docToolchain
- Flink
- Gaiden
- Graal Cloud Native
- Gradle
- Gradle profiler
- Grails
- Groovy
- GroovyServ
- hadoop
- Helidon CLI
- http4k
- Infrastructor
- Jarviz
- JBake
- JBang
- Jikkou
- JDK Mission Control
- Apache JMeter
- Joern
- JReleaser
- Karaf
- kcctl
- ki
- Kobweb
- Kotlin
- kscript
- ktlint
- ktx
- Layrry
- Leiningen
- Maven
- MCS
- Micronaut
- Mule Flow Diagrams
- Maven Daemon
- MyBatis Migrations
- Neo4j-Migrations
- Pierrot
- Pomchecker
- Quarkus CLI
- sbt
- Scala
- Scala CLI
- SchemaCrawler
- Skeletal
- Spark
- Spring Boot
- Sshoogr
- Taxi
- Apache Tomcat
- ToolKit
- Vert.x
- VisualVM
- Webtau
- Znai
命令行使用
安装
安装 SDKMAN!在 UNIX 上轻而易举。它可以毫不费力地在 macOS、Linux 和 Windows (具有 WSL)上安装、配置。 此外,它与 Bash 和 ZSH shell 兼容。
只需启动一个新终端并输入:
curl -s "https://get.sdkman.io" | bash
按照屏幕上的说明完成安装。之后,打开一个新终端或在当前 Shell 中运行以下内容:
source "$HOME/.sdkman/bin/sdkman-init.sh"
最后,运行以下内容以确认安装是否成功:
sdk version
您应该看到包含最新脚本和本机版本的输出:
We periodically need to update the local cache. Please run: $ sdk update SDKMAN! script: 5.18.2 native: 0.1.3
安装到自定义目录
默认安装目录:$HOME/.sdkman
export SDKMAN_DIR="/usr/local/sdkman" && curl -s "https://get.sdkman.io" | bash
安装不修改 Shell 配置
curl -s "https://get.sdkman.io?rcupdate=false" | bash
默认安装会对.bashrc
、.bash_profile
、.profile
、.zshrc
等其中一个(取决于操作系统类型)文件写入一段初始化代码,通过以上命令内容执行安装不会写入初始化代码。
卸载
以下是从您的系统,如何删除 SDKMAN!:
- 删除安装目录:
rm -rf ~/.sdkman
- (如果有)从 Shell 配置中删除初始化代码段
编辑并删除初始化代码段。如果使用 ZSH,请将其从.zshrc
文件中删除。代码段要删除的代码如下所示: 删除后,您已成功卸载 SDKMAN!初始化代码段一般位于以下这些文件中(任一):.bashrc
、.bash_profile
、.profile
、.zshrc
#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!! [[ -s "/home/dudette/.sdkman/bin/sdkman-init.sh" ]] && source "/home/dudette/.sdkman/bin/sdkman-init.sh"
查看版本
sdk version
用法
帮助
查看 sdk 支持的所有命令
sdk help
安装与删除版本
语法:
sdk install <candidate> [version] [path]
- candidate:必选参数,候选者名称,如:java、maven、gradle,可以通过
sdk list
查看所有支持的候选者 - version:可选参数,未指定版本号时默认使用最新稳定版
- path:可选参数,安装本地版本时指定本地 SDK 路径
安装最新稳定版本
安装所选 SDK 的最新稳定版本 (例如,Java JDK)通过运行以下内容:
sdk install java
您将看到类似于以下输出的内容:
Downloading: java 21.0.2-tem In progress... ########################################################################################################################################## 100.0% Repackaging Java 21.0.2-tem... Done repackaging... Installing: java 21.0.2-tem Done installing! Setting java 21.0.2-tem as default.
当不存在多个版本冲突时,默认将当前安装的版本自动设置为默认版本,默认版本将确保所有后续打开的 Shell 将默认使用此版本。
当存在多个 JDK 版本时,系统将提示您是否要将此版本设置为默认版本。
Downloading: java 21.0.1-tem In progress... ########################################################################################################################################## 100.0% Repackaging Java 21.0.1-tem...################################## 46.6% Done repackaging... Installing: java 21.0.1-tem Done installing! Do you want java 21.0.1-tem to be set as default? (Y/n):
回答“Y”(或按回车键)将确保所有后续打开的 Shell 将默认使用此版本的 SDK。
Do you want java 21.0.1-tem to be set as default? (Y/n): Y Setting java 21.0.1-tem as default.
安装特定的版本
sdk install java 21.0.1-tem
安装本地版本
sdk install java alibaba-1.0.0 /path/to/alibabajdk
请注意,本地版本名称(上述示例中的 alibaba-1.0.0)必须是唯一的名称,它尚未在可用版本名称列表中。
删除版本
sdk uninstall java 21.0.1-tem
注意,删除本地版本,之前下载的安装包及解压后的目录均会删除。下一次使用需要重新下载和安装。
列出候选者
要获取可用候选者列表,请执行以下内容:
sdk list
这将呈现一个可搜索的字母列表,其名称为当前每个候选者的默认稳定版本、网站 URL、描述和易于安装的命令。 输出通过管道传输,因此标准键盘快捷键可用于搜索、翻页以及退出。
================================================================================ Available Candidates ================================================================================ q-quit /-search down j-down ?-search up k-up h-help -------------------------------------------------------------------------------- Apache ActiveMQ (Classic) (5.17.1) https://activemq.apache.org/ Apache ActiveMQ<C2><AE> is a popular open source, multi-protocol, Java-based message broker. It supports industry standard protocols so users get the benefits of client choices across a broad range of languages and platforms. Connect from clients written in JavaScript, C, C++, Python, .Net, and more. Integrate your multi-platform applications using the ubiquitous AMQP protocol. Exchange messages between your web applications using STOMP over websockets. Manage your IoT devices using MQTT. Support your existing JMS infrastructure and beyond. ActiveMQ offers the power and flexibility to support any messaging use-case. $ sdk install activemq --------------------------------------------------------------------------------
列出指定候选者版本
sdk list java
您将看到如下的显示:
================================================================================ Available Java Versions for Linux 64bit ================================================================================ Vendor | Use | Version | Dist | Status | Identifier -------------------------------------------------------------------------------- Corretto | | 21.0.2 | amzn | | 21.0.2-amzn | | 21.0.1 | amzn | | 21.0.1-amzn | | 17.0.10 | amzn | | 17.0.10-amzn | | 17.0.9 | amzn | | 17.0.9-amzn | | 11.0.22 | amzn | | 11.0.22-amzn | | 11.0.21 | amzn | | 11.0.21-amzn | | 8.0.402 | amzn | | 8.0.402-amzn | | 8.0.392 | amzn | | 8.0.392-amzn
注意,候选者版本安装时的 version 以 Identifier 为准,而不是 Version。这对于候选者为 java 时有效(如:sdk install java 21.0.1-amzn)。而对于 maven 或其它 SDK,是实际的版本(如:sdk install maven 3.9.6)。在 SDKMAN! 中不同的候选者版本号可能会有差异。是因为 java 有很多不同厂商的发行版本,而 Maven 或其它 SDK 没有。例如,maven 版本列表如下呈现:
================================================================================ Available Maven Versions ================================================================================ 4.0.0-alpha-12 3.8.7 3.3.9 4.0.0-alpha-10 3.8.6 3.3.3 4.0.0-alpha-9 3.8.5 3.3.1 4.0.0-alpha-8 3.8.4 3.2.5 4.0.0-alpha-7 3.8.3 3.2.3 4.0.0-alpha-5 3.8.2 3.2.2 4.0.0-alpha-4 3.8.1 3.2.1 3.9.6 3.6.3 3.1.1 3.9.5 3.6.2 3.1.0 3.9.4 3.6.1 3.0.5 3.9.3 3.6.0 3.0.4 3.9.2 3.5.4 3.9.1 3.5.3 3.9.0 3.5.2 3.8.8 3.5.0
使用
使用候选者版本号时,指定版本号的候选者已经在本地安装。如果未安装会提示安装。通常用于在多个版本中切换时使用。
sdk use java 17.0.10-tem
注意:sdk use 使用的版本只对当前 Shell 有效,重新打开 Shell 或其它已打开 Shell 候选者版本并不会切换。
默认版本
选择将指定定版本设为默认版本:
sdk default java 17.0.10-tem
注意:与 sdk use 的区别,sdk default 将确保所有后续 shell 都将从正在使用的版本 17.0.10-tem 开始。
查看当前版本
查看所有候选者当前版本:
sdk current
查看指定候选者当前版本:
sdk current java
升级版本
升级所有候选者版本:
sdk upgrade
升级指定候选者版本:
sdk upgrade java
检查候选者更新
sdk update
自我更新
更新 SDKMAN! 版本
sdk selfupdate
强制更新 SDKMAN! 版本
sdk selfupdate force
离线模式
启用离线模式
sdk offline enable
禁用离线模式
sdk offline disable
在离线模式下,不会请求网络查询,例如:sdk list 只会列出本地已经安装的版本。
清理
执行该命令会清理元数据和临时目录释放空间
sdk flush
查看安装目录
查看指定版本的候选者安装目录
sdk home java 21.0.1-tem
高阶配置
编辑全局配置:
sdk config
#用于控制 SDKMAN! 在执行某些操作时是否自动回答确认提示 sdkman_auto_answer=false #用于启用或禁用 SDKMAN! 的自动补全功能 sdkman_auto_complete=true #用于控制 SDKMAN! 是否自动切换语言环境 sdkman_auto_env=false #用于控制是否启用 SDKMAN! 的 Beta 版本通道 sdkman_beta_channel=false #用于控制是否启用 SDKMAN! 下载文件的校验和验证 sdkman_checksum_enable=true #控制是否启用 SDKMAN! 命令行界面的颜色显示 sdkman_colour_enable=true #设置 SDKMAN! 使用 curl 命令进行连接的超时时间(以秒为单位)。默认超时时间为 7 秒。如果连接超过指定的时间仍未建立,SDKMAN! 将中断连接尝试 sdkman_curl_connect_timeout=7 #设置 SDKMAN! 使用 curl 命令进行下载的最大时间(以秒为单位)。默认最大下载时间为 10 秒。如果下载时间超过指定的时间仍未完成,SDKMAN! 将中断下载 sdkman_curl_max_time=10 #用于控制是否启用 SDKMAN! 的调试模式 sdkman_debug_mode=false #用于控制是否允许 SDKMAN! 使用不安全的 SSL 连接 sdkman_insecure_ssl=false #用于控制是否启用 SDKMAN! 的自动更新功能 sdkman_selfupdate_feature=true
项目使用
例如,我们有项目 A 和 项目 B。项目 A,使用 JDK(17.0.10-tem)、Maven(3.8.8)。项目 B ,使用 JDK(21.0.2-tem)、Maven(3.9.6),我们如何做到分别进入项目 A、B 项目时,自动切换对应的 SDK 版本呢?
通过 SDKMAN! env 我们可以实现这样的场景。
sdk env init
sdk env init 会在当前目录生成一个.sdkmanrc
文件,文件中描述了使用的 SDK 版本信息,呈现如下:
# Enable auto-env through the sdkman_auto_env config # Add key=value pairs of SDKs to use below java=17.0.10-tem
当我们通过 cd 进入到包含.sdkmanrc
文件的目录时,SDKMAN! 会自动将当前 Shell 的 JDK 版本切换为 17.0.10-tem(如果已经安装了该版本的情况下),退出项目目录时恢复默认的 SDK 版本。未安装该版本的情况下,通过以下命令会自动安装由.sdkmanrc
文件描述指定的 SDK 版本,命令如下:
sdk env install
通过以下命令,将当前 Shell 默认环境恢复到默认状态:
sdk env clear
通过以下命令,可以手动切换 SDK 环境:
sdk env
进入项目自动切换环境,需要修改 SDKMAN! 配置(通过 sdk config 修改):
#将sdkman_auto_env由false修改为true sdkman_auto_env=true
重新打开 Shell 窗口或在当前 Shell 执行以下命令让其生效:
source ~/.sdkman/bin/sdkman-init.sh
针对以上的场景,我们需要在 A 项目执行以下操作:
#进入 A 项目根目录 cd /path/to/A #安装Java指定版本,并在当前Shell使用该版本 sdk install java 17.0.10-tem && sdk use java 17.0.10-tem #安装Maven指定版本,并在当前Shell使用该版本 sdk install maven 3.8.8 && sdk use maven 3.8.8 #初始化当前项目使用的环境 sdk env init #追加 Maven 版本 echo maven=3.8.8 >> .sdkmanrc
在 B 项目执行以下操作:
#进入 A 项目根目录 cd /path/to/B #安装Java指定版本,并在当前Shell使用该版本 sdk install java 21.0.2-tem && sdk use java 21.0.2-tem #安装Maven指定版本,并在当前Shell使用该版本 sdk install maven 3.9.6 && sdk use maven 3.9.6 #初始化当前项目使用的环境 sdk env init #追加 Maven 版本 echo maven=3.9.6 >> .sdkmanrc
执行以上操作后,当我们进入到项目 A 时,您会看到以下信息:
Using java version 17.0.10-tem in this shell. Using maven version 3.8.8 in this shell.
当我们进入到项目 B 时,您会看到以下信息:
Restored java version to 17.0.10-tem (default) Restored maven version to 3.9.6 (default) Using java version 21.0.2-tem in this shell. Using maven version 3.9.6 in this shell.
将.sdkmanrc
文件跟随项目一起提交至版本仓库,团队成员可以通过 SDKMAN! 的统一机制快速安装项目环境。也可以在 Jenkins 物理机上通过该机制,在不影响其它项目 SDK 版本的情况下自由选择由项目指定的 SDK 版本进行项目构建。
其它说明
目前 Jetbrains IDEA 完全适配了 SDKMAN!。因此,当您通过 SDKMAN! 安装在 Linux 或 macOS 上的 JDK,在 IDEA 中是可以被发现的。并且,当您加载项目中包含.sdkmanrc
文件的项目时,IDEA 会自动为您匹配由.sdkmanrc
描述的 JDK 版本无需其它任何操作。
SDKMAN! 命令行有一些缩写代替,详情可以通过查看指定子命令的帮助信息,通过以下内容可以查看指定子命令的帮助信息:
sdk help install
常用的缩写替代如下:
sdk ls <=> sdk list sdk i <=> sdk install sdk u <=> sdk use sdk d <=> sdk default sdk c <=> sdk current
一些扩展
SDKMAN! 本身仅仅是一个命令行工具,其不存储具体的 SDK 信息,对于 JDK 的版本来源于一个开源项目:
通过 FooJay 开放 API,您可以方便地查询当前最受欢迎的基于 OpenJDK 的第三方发行版的所有系统架构的安装包或压缩包信息。
约定
SDKMAN! 5.18.2