SDKMAN! Instalando e utilizando várias versões do Java e de seus amigos
Tags: java, maven, gradle, kotlin
Published: 2024-01-31 23:32:41

Atualmente a melhor maneira de instalar a JDK e também o Kotlin, o Maven, o Gradle e mais alguns outros "amigos" do Java, para os desenvolvedores destas stacks, é através do SDKMAN!

O SDKMAN! é um instalador e gerenciador das versões destas ferramentas. É multiplataforma, funcionando perfeitamente em GNU/Linux, MacOS e Windows. Ele foi construído por desenvolvedores, para desenvolvedores, então essa galera sabe bem o que nós desenvolvedores precisamos no dia-a-dia.

Por vezes precisamos manter mais de uma versão da JDK, por exemplo mantendo Java 8, mas também queremos o Java 17, versões LTS, ou mesmo versões intermediárias, como o Java 19, sem contar que podemos instalar versões diferentes da JDK e de vendors também, como a OpenJDK, GraalVM, Zulu, Corretto entre outras e quando precisamos ter estas versões diversas instaladas na mesma máquina, acabamos tendo um trabalho para mudar a versão no path ou utilizarmos de artíficios como ter um script para fazer este trabalho. Com o SDKMAN! tudo fica muito fácil e organizado, desde a instalação destas ferramentas e posterior troca da versão que você deseja utilizar naquele momento. Neste artigo vamos ver como podemos ter essa mágica à disposição.

## Instalação

Aqui estou cobrindo a instalação e uso do SDKMAN! no Ubuntu GNU/Linux, mas como mencionei acima, é possível te-lo rodando no Windows e no MacOS. Estou executando o Ubuntu 22.04 LTS, se você usa outro sabor de GNU/Linux ou mesmo outra versão do Ubuntu, os comandos podem ser diferentes.

No Ubuntu antes de instalar o SDKMAN! propriamente dito, precisamos ter instalado o _curl_. Para isto, no terminal,  execute o comando abaixo:

<code>
sudo apt install curl
</code>

Após ter o _curl_ instalado, podemos seguir com a instalação do SDKMAN! com o comando:

<code>
curl -s "https://get.sdkman.io" | bash
</code>

A saída deste comando será algo como:

<code>
...
Set version to 5.18.2 ...
Set native version to 0.4.6 ...
Attempt update of interactive bash profile on regular UNIX...
Added sdkman init snippet to /home/kleber/.bashrc
Attempt update of zsh profile...
Updated existing /home/kleber/.zshrc



All done!


You are subscribed to the STABLE channel.

Please open a new terminal, or run the following in the existing one:

    source "/home/kleber/.sdkman/bin/sdkman-init.sh"

Then issue the following command:

    sdk help

Enjoy!!!
</code>

Então temos ao final da saída do comando acima, que devemos executar outro comando (substitua USUARIO pelo seu usuário):

<code>
source "/home/USUARIO/.sdkman/bin/sdkman-init.sh"
</code>

Feito isto o SDKMAN! está instalado, agora vamos instalar algumas versões de JDK e alguns complementos.

## Instalação da JDK

No terminal, podemos executar o comando abaixo para listar as JDKs disponíveis para instalação:

<code>
sdk list java 
</code>

Ao executar o comando acima, teremos uma saída como a abaixo:

<code>
================================================================================
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        
Dragonwell     |     | 17.0.9       | albba   |            | 17.0.9-albba        
:
</code>

Teclando <espaço> as próximas páginas serão exibidas e podemos ver que temos a nossa disposição várias versões da JDK de vários vendors, como Oracle, OpenJDK, Amazon, Zulu, Microsoft entre outras.

Então por exemplo vamos instalar a versão 21 da OpenJDK, para isto execute:

<code>
sdk install java 21.0.2-open
</code>

E teremos uma saída como:

<code>
Downloading: java 21.0.2-open

In progress...

######################################################################### 100,0%

Repackaging Java 21.0.2-open...

Done repackaging...

Installing: java 21.0.2-open
Done installing!


Setting java 21.0.2-open as default.
</code>

Se agora executarmos:

<code>
java --version
</code>

Poderemos confirmar que temos a JVM instalada bem como a JDK que pode ser confirmada com o comando:

<code>
javac --version
</code>

Agora vamos supor que gostaríamos também de ter instalada a versão 17 da GraalVM. Então vamos instalar a GraalVM concomitantemente ao OpenJDK. Para isto execute agora:

<code>
sdk install java 17.0.9-graalce
</code>

Ao instalar mais de uma JDK, somos questionados se queremos que esta nova instalação seja a default ou não:

<code>
Do you want java 17.0.9-graalce to be set as default? (Y/n):
</code>

No meu exemplo vou colocar para a GraalVM ser a default e então se confirmarmos com o mesmo comando que fizemos para a OpenJDK, a saída agora será um pouco diferente pois estará mostrando que estamos utilizando a GraalVM, execute:

<code>
java --version
</code>

E como saída teremos:

<code>
openjdk 17.0.9 2023-10-17
OpenJDK Runtime Environment GraalVM CE 17.0.9+9.1 (build 17.0.9+9-jvmci-23.0-b22)
OpenJDK 64-Bit Server VM GraalVM CE 17.0.9+9.1 (build 17.0.9+9-jvmci-23.0-b22, mixed mode, sharing)
</code>

Repare que agora temos como saída a informação que nosso Java é a versão 17 da GraalVM.

Certo, e como podemos utilizar a outra JDK que temos instalada? Com o comando abaixo definimos qual JDK queremos utilizar:

<code>
sdk use java 21.0.2-open
</code>

Para saber qual JDK está setada atualmente, também podemos executar:

<code>
sdk current
</code>

Com estes poucos comandos fica demonstrado o quão simples é o gerenciamento de versões diferentes da JDK, bem como de vendors distintos, para utilização na mesma máquina. Um exemplo de uso disto é quando precisamos desenvolver algo novo em uma nova versão da JDK, mas por vezes temos o compromisso de manter código de uma versão anterior, na vida real, existem muitos projetos ainda rodando em Java 8 ou 11.

## Complementos

Para trabalhar com Java é quase sempre necessário o uso de um gerenciador de dependências, em geral, Maven ou Gradle.

Em nosso exemplo vamos instalar também o Maven, execute:

<code>
sdk install maven 3.9.6
</code>

E se quisermos confirmar, podemos executar:

<code>
mvn --version
</code>

E teremos uma saída como:

<code>
Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)
Maven home: /home/kleber/.sdkman/candidates/maven/current
Java version: 21.0.2, vendor: Oracle Corporation, runtime: /home/kleber/.sdkman/candidates/java/21.0.2-open
Default locale: pt_BR, platform encoding: UTF-8
OS name: "linux", version: "6.5.0-15-generic", arch: "amd64", family: "unix"
</code>

O lance de poder ter versões distintas para a JDK também vale para tudo o que é possível instalar e gerenciar pelo SDKMAN!, portanto se aplica também ao Maven, por exemplo.

Quer listar as possibilidades de instalação de versões do Maven? Execute:

<code>
sdk list maven
</code>

Quer listar tudo o que está disponível para ser instalado e gerenciado pelo SDKMAN!? Execute:

<code>
sdk list
</code>

Bem, o objetivo deste artigo era apresentar o SDKMAN! e suas possibilidades, que ajudam muito no dia-a-dia dos desenvolvedores da stack Java e derivados.

Como dica final, pra se aprofundar mais nos comandos do SDKMAN!, o help pode contribuir muito e para acessa-lo basta executar:

<code>
sdk help
</code>

Isso é tudo pessoal!

## Referências

- https://sdkman.io/
- https://sdkman.io/usage