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!