SDKMAN!

Sobre

SDKMAN! é uma ferramenta de linha de comando para gerenciar versões paralelas de múltiplos Software Development Kits (SDKs) em sistemas Unix (macOS, Linux e Windows via WSL). Foi originalmente conhecida como GVM (Groovy enVironment Manager) e se inspira em ferramentas como apt, pip, RVM, rbenv e git. É escrita em Rust e bash, licenciada sob Apache 2.0 e mantida por uma comunidade open source.

Funcionamento

A instalação é feita por um script que baixa o binário e configura o ambiente, sem exigir ajustes manuais de HOME ou PATH:

curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk version

A partir daí, todo o gerenciamento é feito pelo comando sdk. Cada SDK instalado (chamado de candidate) fica isolado em ~/.sdkman/candidates/<nome>/<versão>, e o sdk use/sdk default apenas ajustam links/variáveis de shell para apontar para a versão desejada — sem sobrescrever instalações.

Principais Recursos

  • Múltiplos candidates: Java, Scala, Kotlin, Groovy, além de Ant, Gradle, Grails, Maven, SBT, Spark, Spring Boot, Vert.x e outros.
  • Troca de versão por shell ou global: sdk use altera a versão só no shell atual; sdk default define a versão padrão para novos shells.
  • Arquivo .sdkmanrc: fixa versões de SDKs por projeto, com auto-troca ao entrar no diretório (sdkman_auto_env=true).
  • Instalação de versões locais: permite registrar uma instalação já existente no disco (útil para snapshots/builds customizados).
  • API própria: Broker API para clientes e Vendor API para fornecedores publicarem releases.
  • Poucas dependências: requer apenas curl, zip e unzip.

Comandos essenciais

sdk install java              # última versão estável
sdk install scala 3.4.2       # versão específica
sdk list                      # lista candidates disponíveis
sdk list java                 # lista versões de um candidate
sdk use java 21.0.4-tem       # troca só no shell atual
sdk default java 21.0.4-tem   # troca a versão padrão
sdk current                   # versões em uso
sdk uninstall scala 3.4.2     # remove uma versão
sdk upgrade                   # lista candidates desatualizados
sdk env init / sdk env        # gera/usa o .sdkmanrc do projeto

Casos de Uso

  • Alternar entre múltiplas versões de JDK/JVM em projetos diferentes sem reconfigurar variáveis manualmente.
  • Padronizar versões de SDK por projeto via .sdkmanrc, garantindo consistência entre desenvolvedores e CI.
  • Testar rapidamente uma versão específica de uma ferramenta JVM (Gradle, Maven, Kotlin, etc.) sem afetar o ambiente global.
  • Ambientes de CI/CD, usando o modo ci=true para instalação não-interativa.

Instalando a versão do projeto (.sdkmanrc)

Quando o projeto já tem um .sdkmanrc na raiz, o fluxo para instalar e ativar a versão de Java (ou outro candidate) definida nele é:

sdk config                    # habilita sdkman_auto_env=true (só na 1ª vez)
cd /caminho/do/projeto
sdk env install                # instala a versão do .sdkmanrc, se não existir
sdk env                        # ativa a versão no shell atual
sdk current java                # confere a versão ativa

Com sdkman_auto_env=true habilitado em ~/.sdkman/etc/config, o SDKMAN troca a versão automaticamente sempre que você entra (cd) no diretório do projeto, sem precisar rodar sdk env manualmente depois.

Público-alvo

Desenvolvedores do ecossistema JVM (Java, Kotlin, Scala, Groovy) que precisam alternar entre versões de linguagens e ferramentas de build com frequência, em máquinas Unix/WSL.

FAQ

  • Funciona no Windows? Não nativamente — é necessário WSL, ou Git Bash com MinGW (Cygwin não é mais suportado).
  • Como instalar em um local customizado? Exportar SDKMAN_DIR antes de rodar o instalador (ex.: /usr/local/sdkman).
  • Como desinstalar? Remover o diretório ~/.sdkman e o trecho de inicialização do .bashrc/.zshrc/.profile.
  • O que fazer se o cache de candidates estiver desatualizado? Rodar sdk update.

Limitações

  • Requer ambiente bash — não roda nativamente no cmd/PowerShell do Windows.
  • Diretórios internos (como .sdkman/tmp) não devem ser apagados manualmente; usar sempre sdk flush.
  • Depende de conectividade com a API do SDKMAN!; em redes lentas, o healthcheck de startup pode ser desativado via sdkman_healthcheck_enable=false.

Referências