Gerenciando versões diferentes do Java JDK com SDKMAN! [Ubuntu]
- #Linux
- #Java
Você já precisou trabalhar em um projeto antigo em Java 8, mas mantém seu sistema sempre com o último LTS do Java? Ok, a IDE consegue mesclar, mas e quando você precisa rodar no terminal? E quando você precisa exatamente daquela versão específica do Maven?
Seus problemas acabaram… apresento o SDKMAN!
O que é o SDKMAN! ?
SDKMAN! é uma ferramenta que serve para gerenciar versões paralelas de vários SDKs, que o SDKMAN! chama de “candidates”.
Ela fornece uma conveniente Interface de Linha de Comando (CLI) e API para listar, instalar, trocar e remover candidatos. Além disso, ela cuida da parte mais chata do processo que é a definição de variáveis de ambiente.
Ela também permite que os devs instalem SDKs baseados em JVM como Java, Groovy, Scala, Kotlin e Ceylon. Maven, Gradle, SBT, Spring Boot, Vert.x, e muitos outras também são suportadas. O SDKMAN! é um utilitário gratuito, leve e de código aberto escrito em Bash.
Instalando o SDKMAN!
SDKMAN! é suportado na maioria dos sistemas operacionais e pode ser instalado facilmente em todos os sistemas baseados em Unix. E melhor, suporta tanto o Bash como o Zsh.
Então bora instalar via terminal:
$ curl -s "https://get.sdkman.io" | bash
Depois de baixar, ao final da instalação é preciso executar o comando
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
E para testar depois a gente usa o comando
$ sdk version
SDKMAN!
script: 5.16.1
native: 0.1.0
Para ver o que você pode fazer basta usar o comando:
$ sdk help
Listando todos os SDKs disponíveis
$ sdk list
Lista todos os SDKs que o SDKMAN! pode nos ajudar a instalar paralelamente e trocar fácil de versão. Dá para navegar com as setinhas do teclado ou pelas letras ali no começo. Usamos o q para encerrar o comando:
=====================================================
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® 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
--------------------------------------------------------------------------------
Ant (1.10.13) https://ant.apache.org/
:
Instalando e gerenciando versões do Java
=> Listando as Versões
Para listar as versões disponíveis de Java, use o comando list. O resultado é uma tabela de entradas agrupadas pelo fornecedor e ordenadas por versão:
================================================================================
Available Java Versions for Linux 64bit
================================================================================
Vendor | Use | Version | Dist | Status | Identifier
--------------------------------------------------------------------------------
Corretto | | 19.0.2 | amzn | | 19.0.2-amzn
| | 19.0.1 | amzn | installed | 19.0.1-amzn
| >>> | 17.0.6 | amzn | installed | 17.0.6-amzn
| | 17.0.5 | amzn | | 17.0.5-amzn
| | 11.0.18 | amzn | | 11.0.18-amzn
| | 11.0.17 | amzn | | 11.0.17-amzn
| | 8.0.362 | amzn | | 8.0.362-amzn
| | 8.0.352 | amzn | installed | 8.0.352-amzn
Dragonwell | | 17.0.6 | albba | | 17.0.6-albba
Na minha máquina eu uso as versões acima, mas você pode navegar e procurar os seus candidatos favoritos
Vamos precisar deste comando cada vez que quisermos verificar, trocar ou gerenciar o armazenamento dos candidatos.
=> Instalando uma versão de Java
Digamos que queremos instalar a mais nova versão do Java da Azul Zulu que é a 19. Portanto, copiamos ou decoramos seu identificador (pois dá pra usar o [tab] pra ir completando caso necessário) [19.0.2-zulu], e o acrescentamos como argumento no comando install:
$ sdk install java 19.0.2-zulu
Downloading: java 19.0.2-zulu
In progress...
######################################################################### 100,0%
Repackaging Java 19.0.2-zulu...
Done repackaging...
Installing: java 19.0.2-zulu
Done installing!
Do you want java 19.0.2-zulu to be set as default? (Y/n):
Como no meu caso eu já tenho outros instalados, ele me questiona se eu quero escolher essa versão como padrão, caso sim, basta apertar o Enter, ou teclar ‘Y’.
Além disso, ele já atualizará as variáveis de ambiente para podermos usar o Java no terminal imediatamente.
$ java --version
openjdk 19.0.2 2023-01-17
OpenJDK Runtime Environment Zulu19.32+13-CA (build 19.0.2+7)
OpenJDK 64-Bit Server VM Zulu19.32+13-CA (build 19.0.2+7, mixed mode, sharing)
Podemos verificar o status e o uso de qualquer versão usando o comando list. Vou mostrar aqui apenas essa que acabei de instalar como exemplo:
================================================================================
Available Java Versions for Linux 64bit
================================================================================
Vendor | Use | Version | Dist | Status | Identifier
--------------------------------------------------------------------------------
Zulu | >>> | 19.0.2 | zulu | installed | 19.0.2-zulu
| | 19.0.2.fx | zulu | | 19.0.2.fx-zulu
Mas e se eu precisar instalar uma versão que não está na lista, dá? Dá sim, é só colocar como argumento depois do java um nome personalizado e o caminho para o SDK.
$ sdk install java andre-8 ~/Downloads/meu-java-jdk-andre-8
=> Trocando de versão
É muito fácil trocar de versão de Java. Podemos trocar de duas formas, apenas naquele terminal temporariamente:
$ sdk use java 19.0.2-zulu
ou permanentemente:
$ sdk default java 19.0.2-zulu
=> Removendo uma versão
Para remover uma versão é só usar o comando abaixo trocando o argumento após o java pela versão que desejar remover
$ sdk uninstall java 19.0.2-zulu
Uninstalling java 19.0.2-zulu...
=> Mostrando as versões em uso
Para verificar a versão que esta sendo usada no momento usamos o comando current:
$ sdk current java
Using java version 19.0.1-amzn
Ou você pode conferir como fizemos anteriormente com o comando java --version:
$ java -version
openjdk 19.0.1 2022-10-18
OpenJDK Runtime Environment Corretto-19.0.1.10.1 (build 19.0.1+10-FR)
OpenJDK 64-Bit Server VM Corretto-19.0.1.10.1 (build 19.0.1+10-FR, mixed mode, sharing)
Para exibir todas as versões atuais de todos os SDK que estão sendo gerenciadas pelo SDKMAN!, usamos o comando current sem nenhum argumento:
$ sdk current
Using:
java: 19.0.1-amzn
maven: 3.8.7
springboot: 3.0.1
Usando o SDKMAN! em outros lugares
As instalações de SDK ficam guardadas por padrão no diretório do SDKMAN! cujo padrão é ~/.sdkman/candidates.
Podemos observar que todas as diferentes versões de Java que instalarmos vão ficar disponíveis para todo o sistema no caminho ~/.sdkman/candidates/java/ e cada subdiretório é nomeado de acordo com sua versão:
$ ls -al ~/.sdkman/candidates/java/
total 20
drwxrwxr-x 5 andre andre 4096 fev 13 00:42 .
drwxrwxr-x 5 andre andre 4096 jan 17 23:27 ..
lrwxrwxrwx 1 andre andre 58 jan 30 19:02 13.0.14-zulu -> /home/andre/java-sdks/zulu13.54.17-ca-jdk13.0.14-linux_x64
lrwxrwxrwx 1 andre andre 34 jan 26 15:03 15.0.2-aojdk -> /home/andre/java-sdks/jdk-15.0.2+7
drwxr-xr-x 9 andre andre 4096 jan 10 18:45 17.0.6-amzn
drwxr-xr-x 9 andre andre 4096 out 12 21:43 19.0.1-amzn
drwxr-xr-x 7 andre andre 4096 out 14 00:53 8.0.352-amzn
lrwxrwxrwx 1 andre andre 11 jan 28 20:06 current -> 17.0.6-amzn
Portanto, a versão atualmente selecionada de Java também estará disponível como atual nesse diretório.
Na mesma linha, o Gradle ou qualquer outro SDK será instalado dentro do diretório candidates.
Desta forma, podemos utilizar qualquer versão particular de Java, por exemplo, em nossa IDE favorita. Tudo o que temos que fazer é copiar o caminho de uma versão específica e defini-la na configuração de nossa IDE.
Conclusão
Vimos como é simples e prático mantermos várias versões de Java e de outras SDK com o SDKMAN!
Espero que ajude em sua caminhada como ajudou na minha.
Baseado no artigo: https://www.baeldung.com/java-sdkman-intro#install-sdkman