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.
- Site oficial: sdkman.io
- Repositório: github.com/sdkman
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 versionA 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 usealtera a versão só no shell atual;sdk defaultdefine 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,zipeunzip.
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 projetoCasos 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=truepara 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 ativaCom 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_DIRantes de rodar o instalador (ex.:/usr/local/sdkman). - Como desinstalar? Remover o diretório
~/.sdkmane 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 sempresdk flush. - Depende de conectividade com a API do SDKMAN!; em redes lentas, o healthcheck de startup pode ser desativado via
sdkman_healthcheck_enable=false.