La herramienta SDKMAN para instalar varias versiones del JDK y software de la plataforma Java

Escrito por picodotdev el .
java planeta-codigo
Enlace permanente Comentarios

En ocasiones es necesario tener instaladas varias versiones de JDK según el proyecto, unos quizá usen Java 8 y otros quizá usen Java 11 o posterior. El gestor de software SDKMAN permite instalar múltiples versiones del JDK de forma simultánea y usar la deseada a conveniencia. Adicionalmente también permite instalar otras herramientas de la plataforma Java como Gradle y Maven o lenguajes como Groovy entre otros SDK comunes disponibles.

SDKMAN

Cuando usaba Windows para instalar el JDK para programar en Java siempre me lo descargaba de la página de Oracle, el típico instalador de Windows con un asistente que dejaba el JDK instalado en el sistema. Desde que uso GNU/Linux siempre he usado la versión del JDK del proyecto OpenJDK del que el JDK de Oracle toma como fuente y posteriormente la empresa de Larry Ellison añade sus modificaciones y extensiones algunas no libres.

El inconveniente surge cuando hay que instalar una nueva versión, lo que posiblemente implica desinstalar la antigua y repetir el proceso de instalación con la nueva. En Windows hasta donde he conocido un proceso manual que ahora con WinGet al estilo de los gestores de paquetes de GNU/Linux lo mantenga actualizado al actualizar el sistema sin apenas intervención por parte del usuario.

Pero ahora con el nuevo ciclo de desarrollo del JDK que publica una nueva versión cada seis meses y una versión de soporte a largo plazo cada tres años las versiones son enormemente frecuentes a los que los usuarios de Java estábamos acostumbrados con una publicación cada dos o más años. Al mismo tiempo han surgido múltiples implementaciones o distribuciones del JDK, por ejemplo Amazon ofrece Corretto también están AdoptOpenJDK entre algunas otras menos populares. Tener múltiples versiones o implementaciones del JDK en el sistema implica habitualmente tener que cambiar una variable de entorno para indicar cual es el directorio home del JDK que se desea usar. Esta gestión de la versión del JDK es manual y poco práctica ya que afecta a nivel global del sistema lo que impide usar diferentes versiones de JDK según la aplicación o proyecto, quizá unos proyectos usen Java 8 y otros Java 11 u otro más reciente.

Qué es SDKMAN y qué ventajas tiene

SDKMAN es un gestor de paquetes basado en línea de comandos para instalar y mantener actualizado software de la plataforma Java no solo para el JDK sino que para otras muchas librerías, utilidades y SDK comunes como las herramientas de construcción Gradle y Maven, lenguajes para la plataforma como Groovy, Ceylon o Scala, la nombrada utilidad para crear software de código nativo GraalVM com importantes mejoras en rendimiento en tiempo de ejecución y consumo de memoria. La herramienta SDKMAN tiene las ventajas de poder instalar varias versiones del JDK, múltiples implementaciones y poder usar una versión distinta según el proyecto, permite solucionar los problemas anteriores.

En los últimos años hasta ahora siempre he usado el paquete de la distribución Arch Linux que uso para el JDK y Gradle pero a partir de ahora empezaré a usar SDKMAN ya que permite tener instaladas simultáneamente varias versiones, tiene versiones adicionales que no están disponibles en la distribución y permite cambiar fácilmente entre versiones sin necesidad de permisos de superusuario. La desventaja que tiene SDKMAN es que al no usar el paquete de la distribución no se puede instalar ningún paquete que requiera Java, en el caso de Arch Linux los paquetes del JDK como jdk11-openjdk proporcionan la depdendencia java-environment que es necesaria para algunos otros paquetes como intellij-idea-community-edition. La solución es instalar los programas mediante Flatpak si están disponibles en esta forma de distribución de software.

Instalación

La instalación de SDKMAN consiste en ejecutar los siguientes comandos, el primero descarga e instala los scripts de SDKMAM en la carpeta personal del usuario, ~/.sdkman. También modifica los archivos de configuración del intérprete de comandos bash o zsh que permiten establecer las variables de entorno que necesita cuando se inicia una nueva terminal. Los dos últimos permiten comprobar que la instalación se ha realizado correctamente.

SDKMAN solo está disponible de forma nativa para los sistemas UNIX entre ellos GNU/Linux pero no Windows dado que está basado en scripts de bash. Para Windows es necesario utilizar Windows Linux Subsystem o WLS, Cygwin o MSYS+MinGW.

1
2
3
$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
$ sdk version
install.sh

Uso

La utilidad de línea de comandos SDKMAN es sdk, una utilidad sencilla con varias operaciones para instalar, actualizar, desinstalar o usar la última versión o una determinada versión. Las notas de ayuda de la utilidad son bastante explicativas de cómo usar esta herramienta.

El término candidate hace referencia al paquete de software, puede ser un JDK o un SDK. El término versión indica la versión afectada por el comando del paquete de software candidate previamente indicado. Si estas notas no son suficientes hay una guía de uso.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ sdk

Usage: sdk <command> [candidate] [version]
      sdk offline <enable|disable>

  commands:
      install   or i    <candidate> [version] [local-path]
      uninstall or rm   <candidate> <version>
      list      or ls   [candidate]
      use       or u    <candidate> <version>
      default   or d    <candidate> [version]
      current   or c    [candidate]
      upgrade   or ug   [candidate]
      version   or v
      broadcast or b
      help      or h
      offline           [enable|disable]
      selfupdate        [force]
      update
      flush             <broadcast|archives|temp>

  candidate  :  the SDK to install: groovy, scala, grails, gradle, kotlin, etc.
                use list command for comprehensive list of candidates
                eg: $ sdk list
  version    :  where optional, defaults to latest stable if not provided
                eg: $ sdk install groovy
  local-path :  optional path to an existing local installation
                eg: $ sdk install groovy 2.4.13-local /opt/groovy-2.4.13
usage.sh

En la página de SDKMAM hay una lista de JDK y SDK disponibles en este gestor de software. Los comandos más habituales son list para listar candidatos y versiones disponibles, install para instalar software, upgrade para actualizar a la última versión el candidato indicado o todos los instalados si no se indica ninguno, use para usar una versión específica de un candidato durante la sesión de la terminal, default para establecer la versión por defecto de un candidato y uninstall para desinstalar un candidato y versión. En el siguiente ejemplo se muestra como instalar varias versiones del JDK, usarlas y cambiar entre versiones.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
$ sdk list java
================================================================================
Available Java Versions
================================================================================
 Vendor        | Use | Version      | Dist    | Status     | Identifier
--------------------------------------------------------------------------------
 AdoptOpenJDK  |     | 14.0.1.j9    | adpt    |            | 14.0.1.j9-adpt      
               |     | 14.0.1.hs    | adpt    |            | 14.0.1.hs-adpt      
               |     | 13.0.2.j9    | adpt    |            | 13.0.2.j9-adpt      
               |     | 13.0.2.hs    | adpt    |            | 13.0.2.hs-adpt      
               |     | 12.0.2.j9    | adpt    |            | 12.0.2.j9-adpt      
               |     | 12.0.2.hs    | adpt    |            | 12.0.2.hs-adpt      
               |     | 11.0.7.j9    | adpt    |            | 11.0.7.j9-adpt      
               |     | 11.0.7.hs    | adpt    |            | 11.0.7.hs-adpt      
               |     | 8.0.252.j9   | adpt    |            | 8.0.252.j9-adpt     
               |     | 8.0.252.hs   | adpt    |            | 8.0.252.hs-adpt     
 Amazon        |     | 11.0.7       | amzn    |            | 11.0.7-amzn         
               |     | 8.0.252      | amzn    |            | 8.0.252-amzn        
...
 GraalVM       |     | 20.1.0.r11   | grl     |            | 20.1.0.r11-grl      
...
 Java.net      |     | 15.ea.26     | open    |            | 15.ea.26-open       
               |     | 14.0.1       | open    |            | 14.0.1-open         
               |     | 13.0.2       | open    |            | 13.0.2-open         
               |     | 12.0.2       | open    |            | 12.0.2-open         
               |     | 11.0.7       | open    |            | 11.0.7-open         
               |     | 10.0.2       | open    |            | 10.0.2-open         
               |     | 9.0.4        | open    |            | 9.0.4-open          
               |     | 8.0.252      | open    |            | 8.0.252-open        
...  
================================================================================
Use the Identifier for installation:

    $ sdk install java 11.0.3.hs-adpt
================================================================================

$ sdk install java 8.0.252-open
$ sdk install java 11.0.7-open
$ sdk install java 14.0.1-open
$ sdk default java 11.0.7-open

$ sdk use java 8.0.252-open
$ java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

$ sdk use java 11.0.7-open
$ java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment 18.9 (build 11.0.7+10)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.7+10, mixed mode)

$ sdk use java 14.0.1-open
$ java -version
openjdk version "14.0.1" 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+7)
OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)

$ sdk upgrade
commands.sh

En la distribución inmutable Fedora Silverblue esta herramienta es especialmente útil ya que todo el software que instala lo hace en la carpeta personal del usuario, ni pedir permisos de administrador del sistema para instalar o desinstalar candidatos.

Comparte el artículo: