SDKMan!

Logo do SDKMan!
Figura 1 - Logo do SDKMan!

O intuito desse post é apresentar a ferramenta SDKMan!, que é definida pelos seus desenvolvedores como uma ferramenta para "gerenciar versões paralelas de múltiplos Kits de Desenvolvimento de Software (SDKs em inglês).

De modo simplificado, o SDKMan! permite por exemplo, que você instale diferentes versões do Java, como 8 e 12, e possa facilmente alternar entre elas, conforme sua necessidade.

Vamos ver como instalar o SDKMan! no Ubuntu.

Instalando o SDKMan! no Ubuntu

A página de instalação do SDKMan! é bem completa, e comenta inclusive possíveis alternativas para instalação do SDKMan!, mas basicamente para fazer a instalação no Ubuntu temos que seguir somente 3 passos. O primeiro é baixar o arquivo de instalação, o segundo é executá-lo, e posteriormente dar um source para carregar as variáveis de ambiente que o SDKMan! utiliza. No entanto, podemos unir os três passos em um único comando:

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

Observe que o comando curl é utilizado para fazer o download do arquivo de instalação, e sua saída é a entrada para o comando bash, que executa o script de instalação. Na instalação é gerado o arquivo $HOME/.sdkman/bin/sdkman-init.sh, que é um shell script que inicializa as variáveis de ambiente utilizadas pelo SDKMan!

Podemos verificar as variáveis definidas por ele assim:

env | grep SDK

No meu caso, tenho:

SDKMAN_PLATFORM=Linux64
SDKMAN_CANDIDATES_API=https://api.sdkman.io/2
SDKMAN_VERSION=5.7.4+362
SDKMAN_DIR=/home/bruno/.sdkman
J2SDKDIR=/usr/lib/jvm/java-8-oracle
SDKMAN_CANDIDATES_DIR=/home/bruno/.sdkman/candidates

O SDKMAN_DIR mostra o diretório no qual está instalado o SDKMan!, já a variável SDKMAN_CANDIDATES_DIR representa o diretório no qual serão instalados os SDKs baixados por ele. É possível visualizar a versão do SDKMan! com o seguinte comando:

sdk version

Cuja saída é semelhante a essa:

==== BROADCAST =================================================================
* 2020-04-15: Gradle 6.4-rc-1 released on SDKMAN! #gradle
* 2020-04-15: Kotlin 1.3.72 released on SDKMAN! #kotlin
* 2020-04-15: sbt 1.3.10 released on SDKMAN! #scala
================================================================================

SDKMAN 5.7.4+362

Uma vez instalado nosso amiguinho, o próximo e mais interessante passo é efetivamente utilizar o SDKMan!

Instalando versões de SDKs com o SDKMan!

Inicialmente, devemos escolher qual SDK pretendemos baixar, bem como a versão desejada. Para ter acesso a lista de SDKs que podem ser instalados use o seguinte comando:

sdk list

Você vai ver que há uma infinidade de SDKs disponíveis. Exemplo de saída do comando:

--------------------------------------------------------------------------------
Maven (3.6.3)                                          https://maven.apache.org/

Apache Maven is a software project management and comprehension tool. Based on
the concept of a project object model (POM), Maven can manage a project's build,
reporting and documentation from a central piece of information.

                                                             $ sdk install maven
--------------------------------------------------------------------------------
Micronaut (1.3.4)                                           http://micronaut.io/

Micronaut is an open source microservice framework for the JVM

                                                         $ sdk install micronaut
--------------------------------------------------------------------------------
sbt (1.3.10)                                           http://www.scala-sbt.org/

SBT is an open source build tool for Scala and Java projects, similar to Java's
Maven or Ant. Its main features are: native support for compiling Scala code and
integrating with many Scala test frameworks; build descriptions written in Scala
using a DSL; dependency management using Ivy (which supports Maven-format
repositories); continuous compilation, testing, and deployment; integration with
the Scala interpreter for rapid iteration and debugging; support for mixed
Java/Scala projects

                                                               $ sdk install sbt
--------------------------------------------------------------------------------
Scala (2.13.1)                                        http://www.scala-lang.org/

Scala is a programming language for general software applications. Scala has
full support for functional programming and a very strong static type system.
This allows programs written in Scala to be very concise and thus smaller in
size than other general-purpose programming languages. Scala source code is
intended to be compiled to Java bytecode, so that the resulting executable code
runs on a Java virtual machine. Java libraries may be used directly in Scala
code and vice versa. Scala is object-oriented, and uses a curly-brace syntax.
Scala has many features of functional programming languages, including currying,
type inference, immutability, lazy evaluation, and pattern matching. It also has
an advanced type system supporting algebraic data types, covariance and
contravariance, higher-order types, and anonymous types. Other features of Scala
include operator overloading, optional parameters, named parameters, raw
strings, and no checked exceptions.

                                                             $ sdk install scala

Para você navegar pela lista, utilize as teclas j para rolar a lista para baixo e k para rolar para cima, ou simplesmente as teclas cima e baixo. Para buscar um SDK específico use / mais o nome do SDK (busca os próximos da lista) ou ? e o nome do SDK (busca os anteriores da lista).

Repare que a lista mostra o nome do SDK, bem como a versão mais atual disponível entre parênteses, além do site do SDK, sua descrição, e o comando utilizado para instalar a versão mais atual, sdk install micronaut, por exemplo.

Quando você escolher seu SDK, pode apertar q para sair da listagem.

Uma vez escolhido o SDK, ou você utiliza o seguinte comando para instalar a versão mais atual:

sdk install NOME_DO_SDK

Ou pode buscar as versões disponíveis para a instalação, usando:

sdk list NOME_DO_SDK

No caso do Micronaut por exemplo (sdk list micronaut), temos:

================================================================================
Available Micronaut Versions
================================================================================
 > * 2.0.0.M2            1.2.6               1.1.0.RC1           1.0.0.M1       
     2.0.0.M1            1.2.5               1.1.0.M2                           
     1.3.4               1.2.4               1.1.0.M1                           
     1.3.3               1.2.3               1.0.5                              
     1.3.2               1.2.2               1.0.4                              
     1.3.1               1.2.1               1.0.3                              
   * 1.3.0               1.2.0               1.0.2                              
     1.3.0.RC1           1.2.0.RC2           1.0.1                              
     1.3.0.M2            1.2.0.RC1           1.0.0                              
     1.3.0.M1            1.1.4               1.0.0.RC3                          
     1.2.11              1.1.3               1.0.0.RC2                          
     1.2.10              1.1.2               1.0.0.RC1                          
     1.2.9               1.1.1               1.0.0.M4                           
     1.2.8               1.1.0               1.0.0.M3                           
     1.2.7               1.1.0.RC2           1.0.0.M2                           

================================================================================
+ - local version
* - installed
> - currently in use
================================================================================

Todas essas versões estão disponíveis. Repare que na listagem, o * asterisco ao lado do número da versão representa que ela está instalada no computador. O > representa que ela é a versão que está sendo utilizada no momento, e o + representa uma versão que você tenha instalado manualmente (não abordarei esse tópico hoje).

Sendo assim, para o exemplo apresentado, as versões 1.3.0 e 2.0.0.M2 estão instaladas, e a 2.0.0.M2 está em uso. Para instalar uma versão específica, use o seguinte comando:

sdk install NOME_SDK VERSAO_SDK

Para instalar a versão 1.1.1 do micronaut, teríamos: sdk install micronaut 1.1.1. Como eu já tenho outras versões do Micronaut ele pergunta se desejo utilizar a versão 1.1.1 como padrão:


Downloading: micronaut 1.1.1

In progress...

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

Installing: micronaut 1.1.1
Done installing!

Do you want micronaut 1.1.1 to be set as default? (Y/n): Y

Setting micronaut 1.1.1 as default.

Como respondi Y, ele informa que ela foi definida como padrão.

Já no caso do Scala, como eu não tinha nenhuma versão instalada, ele já automaticamente define como padrão:


Downloading: scala 2.13.1

In progress...

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

Installing: scala 2.13.1
Done installing!


Setting scala 2.13.1 as default.

Agora posso usar normalmente os comandos do Micronaut e do Scala nos meus terminais, respectivamente mn e scala.

Alterando a versão padrão de um SDK

Quando você quiser trocar a versão padrão de um determinado SDK, deve executar o comando a seguir:

sdk default NOME_SDK VERSAO_SDK

Por exemplo, para definir o Micronaut versão 2.0.0.M2 como padrão, o comando é sdk default micronaut 2.0.0.M2, e cuja saída será:

Default micronaut version set to 2.0.0.M2

Ao definir uma versão como padrão, qualquer terminal que você abrir, usará essa versão como padrão.

Alterando a versão de um SDK em um único terminal

Há casos em que você pode querer executar uma versão específica de um SDK em um único terminal, por exemplo para fazer um teste. Nesse caso, pode usar:

sdk use NOME_SDK VERSAO_SDK

Enquanto o terminal ficar aberto, ele usará a versão que você informou com o comando. Porém se abrir um novo terminal, a versão utilizada no novo terminal será a padrão definida na instalaçao ou com o comando sdk default.

Removendo uma versão de um SDK

Quando você não for mais utilizar alguma versão de um SDK, pode usar o seguinte comando:

sdk uninstall NOME_SDK VERSAO_SDK

Conferindo a versão de um SDK que está em uso

Para conferir qual versão do SDK está em uso, você deve utilizar o comando a seguir:

sdk current NOME_SDK

A saída será semelhante a essa:

Using micronaut version 2.0.0.M2

O diretório SDKMAN_CANDIDATES_DIR

O diretório representado pela variável de ambiente SDKMAN_CANDIDATES_DIR, que no meu caso é /home/bruno/.sdkman/candidates é bem importante, e a seguir vamos entender o porquê. Você pode verificar sua estrutura com o comando:

ls -ltrah $SDKMAN_CANDIDATES_DIR

Dentro dele é criado um diretório para cada SDK instalado. No meu caso eu tenho:

total 36K
drwxrwxr-x  5 bruno bruno 4,0K Jan 29  2019 grails
drwxrwxr-x  3 bruno bruno 4,0K Jan 29  2019 groovy
drwxrwxr-x  5 bruno bruno 4,0K Mar  5  2019 gradle
drwxrwxr-x 10 bruno bruno 4,0K Apr  8 17:37 ..
drwxrwxr-x  4 bruno bruno 4,0K Apr  8 18:02 maven
drwxrwxr-x  6 bruno bruno 4,0K Apr  8 18:04 java
drwxrwxr-x  9 bruno bruno 4,0K Apr 16 11:55 .
drwxrwxr-x  3 bruno bruno 4,0K Apr 16 11:55 scala
drwxrwxr-x  4 bruno bruno 4,0K Apr 16 12:02 micronaut

Vamos ver por exemplo o conteúdo do diretório gradle:

drwxr-xr-x 6 bruno bruno 4,0K Apr 10  2017 3.5
drwxr-xr-x 6 bruno bruno 4,0K Feb 28  2018 4.6
drwxr-xr-x 6 bruno bruno 4,0K Apr 18  2018 4.7
lrwxrwxrwx 1 bruno bruno   41 Jun 30  2018 current -> /home/bruno/.sdkman/candidates/gradle/4.7
drwxrwxr-x 5 bruno bruno 4,0K Mar  5  2019 .
drwxrwxr-x 9 bruno bruno 4,0K Apr 16 11:55 ..

Observe que é criado um diretório para cada versão, e um link current que aponta para a versão padrão, no meu caso a 2.0.0.M2. Você pode usar esses diretórios para por exemplo definir a versão utilizada pela sua IDE. Se utilizar o current, vai pode trocar a versão facilmente com o SDKMan!. Ou seja, facilmente você "chaveia" entre as versões dos seus SDKs.

Conclusão

Espero que você tenha percebido o quão rápido, fácil e intuitivo é instalar, e utilizar o SDKMan! para instalar SDKs, e alternar entre as versões instaladas. Se você achou esse tópico útil, peço gentilmente que compartilhe nas suas redes sociais, para que mais pessoas tenham acesso a essa excelente ferramenta!

Até a próxima!

results matching ""

    No results matching ""