SDKMAN! 使用指南

工具3个月前更新 四哥説
307 0

SDKMAN! 使用指南

认识 SDKMAN!

SDKMan 是一个开源的软件包管理工具,用于管理和切换不同版本的虚拟机(VM)类语言包,例如 Java、Groovy、Scala、Kotlin 等。它旨在简化在 Linux/Unix 系统上同时安装和切换多个语言版本的过程。

SDKMan 的主要功能包括:

  • 安装和管理多个版本:SDKMan 允许用户轻松地安装和管理多个版本的虚拟机语言包。您可以使用 SDKMan 安装不同版本的 Java、Groovy、Scala 等语言,而无需手动处理版本冲突或环境变量设置。
  • 版本切换:SDKMan 提供了一个简单的命令行界面,使用户可以方便地在不同的语言版本之间进行切换。您可以通过简单的命令来激活所需的语言版本,从而轻松地在不同的项目中使用不同的语言环境。
  • 插件和扩展:SDKMan 支持插件和扩展,可以根据特定需求进行定制和扩展。您可以安装额外的插件来增加功能,或针对特定语言包进行扩展。
  • 简化的命令行界面:SDKMan 提供了一个简洁而易用的命令行界面,使用户可以直接从终端执行各种操作,例如安装、切换、列出可用版本等。

系统环境

SDKMAN! 主要支持在 Linux 和 Unix 系统上管理和切换多个版本的虚拟机(VM)类语言包。具体而言,它可以在以下环境中使用:

  1. Linux 发行版:SDKMAN! 可以在各种 Linux 发行版上使用,包括但不限于 Ubuntu、Debian、Fedora、CentOS、Arch Linux 等。
  2. Unix 系统:SDKMAN! 也可以在一些 Unix 系统上使用,例如 macOS(基于 BSD)和 Solaris。
  3. 虚拟机语言包:SDKMAN! 提供对多个虚拟机语言包的支持,包括但不限于以下语言:
    • Java:包括 OpenJDK 和 Oracle JDK。
    • Groovy:用于 JVM 上的动态编程语言。
    • Scala:一种运行在 Java 虚拟机上的静态类型编程语言。
    • Kotlin:一种基于 JVM 的现代编程语言。
    • Grails:用于构建基于 Groovy 的 Web 应用程序的框架。
    • Gradle:用于构建和自动化构建过程的构建工具。
  • Windows 系统:对于 Windows 系统,需要借助 WSL 使用。

JDK 支持列表

Available JDKs

SDK 支持列表

Available SDKs

命令行使用

安装

安装 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!:

  1. 删除安装目录:
rm -rf ~/.sdkman
  1. (如果有)从 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 的第三方发行版的所有系统架构的安装包或压缩包信息。

 

Foojay Open API:Apifox

SDKMAN! Open API:Apifox

约定

SDKMAN! 5.18.2

© 版权声明

相关文章

暂无评论

暂无评论...