Diferentes versiones de Java, SDKMAN al rescate

En esta entrada vamos a hablar de una herramientas muy útil, que me ha simplificado la vida, cuando me veo en la necesidad de estar alternando entre diferentes versión de java.  Este es un escenario muy común para un desarrollador, en especial si se llevan diferentes proyectos los cuales a su a vez tienen diferentes versión de java, maven, gradle o cualquier derivado de java.

El sitio principal de sdk tiene una gran cantidad de información y ejemplos, pero esta guía vamos a tratar de resumir y condensar este proceso de instalación de sdk y el proceso de instalación de software  mediante sdk.

El siguiente proceso es compatible con cualquier sistema UNIX-like, esto incluye Mac OSX, Linux, Cygwin y aunque no lo he probado en Solaris and FreeBSD, también los incluye.

Todos los scripts los ejecutaremos dentro un contenedor docker limpio, por lo que sera como si nunca lo hubiéramos instalador antes, recomendamos que también sigas los ejemplos de la misma forma, podrás practicar sin comprometer tu sistema principales y ademas puede repetir varias veces el proceso y cada vez inicias en un sistema limpio, en otras palabras desde cero y cuando ya estés lo suficientemente listo puedes aplicar lo aprendido en tu sistema principal.  Si te decides por utilizar docker puedes iniciar tu contenedor de la siguiente forma:

administrador@TIO-gt-dev ~/Descargas $ docker run -it --rm --name sdkman debian

Si quieres una guía de docker, espérala, pronto estará en esta comunidad.

Instalación

Para instalar sdkman basta con ejecutar el siguiente comando:

root@d704f9296a9b:/# curl -s "https://get.sdkman.io" | bash

En el proceso de instalación se te podrá requerir que instales algún paquete en caso de no cumplir, en la mayoría de casos puede ser unzip o zip, lo que se requiera.

Luego instalar revisa tu fichero ~/.bashrc o según tu distribución puede ser ~/.bash_profile, en este fichero deberías encontrar algo como:

root@d704f9296a9b:/# cat ~/.bashrc 
#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="/root/.sdkman"
[[ -s "/root/.sdkman/bin/sdkman-init.sh" ]] && source "/root/.sdkman/bin/sdkman-init.sh"
root@d704f9296a9b:/#

Para seguir utilizando la misma consola en la que te encuentra basta con que compiles este fichero.

root@d704f9296a9b:/# source ~/.bashrc

Con esto ya podemos comprobar que todo anda bien y usar el comando sdk, por ejemplo podemos ver la versión instalada con el siguiente comando:

root@d704f9296a9b:/# sdk version

SDKMAN 5.6.1+290
root@d704f9296a9b:/#

Comandos mas recurrentes

Siempre puedes consultar la documentación en consola para revisar en detalle cada comando de sdk.

root@d704f9296a9b:/# sdk

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

   commands:
       install   or i    <candidate> [version]
       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             <candidates|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

root@d704f9296a9b:/#

A continuación vamos a describir los comandos mas recurrentes y su forma de uso:

  • list, muestra los programas disponibles para instalar mediante sdk
  • install, instala el programa especificado
  • unistall, elimina el programa especificado
  • use, especifica la versión del programa a utilizar en esa sesión de consola
  • default, especifica la versión del programa para utilizar por default
  • current, muestra la versión en uso del programa especificado

Ejemplos

Resta lo mas interesante el área practica, en la que veremos casos de uso reales tanto del jdk como dos de las herramientas de build mas importante dentro del mundo Java, las cuales son grade y maven.

Practicando con JAVA

Antes de instalar java vamos a verificar las versiones que están disponibles para su instalación:

root@a4e0700b13e7:/# sdk list java

================================================================================
Available Java Versions
================================================================================
     9.0.4-oracle                                                                  
     9.0.1-zulu                                                                    
     9.0.0-zulu                                                                    
     8u161-oracle                                                                  
     8u152-zulu                                                                    
     8u144-zulu                                                                    
     8u131-zulu                                                                    
     7u141-zulu                                                                    
     6u93-zulu                                                                                                                                
================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
root@a4e0700b13e7:/#

Como todo buen amante de la tecnológica nos instalaremos la ultima versión de java:

root@a4e0700b13e7:/# sdk add java 9.0.4-oracle

Verificamos que tenemos la versión correcta:

root@a4e0700b13e7:/# java -version
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
root@a4e0700b13e7:/#

Con esto estamos listo para trabajar día a día con lo ultimo de nuestro buen amigo java.

Ahora supongamos que nos llega un proyecto en que debemos trabajar y este requiere una versión posterior de java, tradicionalmente es trabajo tedioso y si abonamos el mantener las diferentes versión de maven o gradle, esto es mas tedioso a un, pues veamos que podemos hacer con sdkman.

Primero supongamos que debemos trabajar con la versión 7 del jdk, si tienes la versión exacta en hora buena, si no selecciona la mas cercana, por lo general java mantiene una gran compatibilidad entre sus actualizaciones menores.

root@a4e0700b13e7:/# sdk ls java

================================================================================
Available Java Versions
================================================================================
 > * 9.0.4-oracle                                                                  
     9.0.1-zulu                                                                    
     9.0.0-zulu                                                                    
     8u161-oracle                                                                  
     8u152-zulu                                                                    
     8u144-zulu                                                                    
     8u131-zulu                                                                    
     7u141-zulu                                                                    
     6u93-zulu                                                                     
================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
root@a4e0700b13e7:/#

Una vez identificada la versión, en este caso seleccionamos la versión 8u152-zulu, procedemos a instalarlo, pero como ya tenemos instalada una versión sdk nos preguntara si queremos que sea nuestra versión por defecto, en esta caso le diremos que no, ya que solo deseamos utilizarla cuando estemos trabajando en el proyecto especifico:

root@a4e0700b13e7:/# sdk install java 8u152-zulu

Downloading: java 8u152-zulu

In progress...

######################################################################## 100.0%

Repackaging Java 8u152-zulu...

Done repackaging...

Installing: java 8u152-zulu
Done installing!

Do you want java 8u152-zulu to be set as default? (Y/n): n
root@a4e0700b13e7:/#

Si ahora verificamos la versión de java veremos que seguimos manteniendo la anterior, esto debido a que sdk seguira manteniendo como versión default la primera instalación que realizamos, veamos:

root@a4e0700b13e7:/# java -version
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
root@a4e0700b13e7:/#
root@a4e0700b13e7:/# sdk list java

================================================================================
Available Java Versions
================================================================================
 > * 9.0.4-oracle                                                                  
     9.0.1-zulu                                                                    
     9.0.0-zulu                                                                    
     8u161-oracle                                                                  
   * 8u152-zulu                                                                    
     8u144-zulu                                                                    
     8u131-zulu                                                                    
     7u141-zulu                                                                    
     6u93-zulu                                                                     
================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
root@a4e0700b13e7:/#

Con esto podemos seguir usando la versión mas actualizada en todas nuestras tareas propias y si cambiamos al proyecto de turno, podemos cambiar la versión de la siguiente forma:

root@a4e0700b13e7:/# sdk use java 8u152-zulu

Using java version 8u152-zulu in this shell.
root@a4e0700b13e7:/# java -version
openjdk version "1.8.0_152"
OpenJDK Runtime Environment (Zulu 8.25.0.1-linux64) (build 1.8.0_152-b16)
OpenJDK 64-Bit Server VM (Zulu 8.25.0.1-linux64) (build 25.152-b16, mixed mode)
root@a4e0700b13e7:/#

Con esto ya estamos listo para trabajar con la versión de java requerida, y lo mejor si cambias de consola o cierras la consola activa, la versión por default seguirá siendo la misma que la instalada al principio.  En cambio si lo que necesitas es cambiar la versión por default también puedes realizarlo de la siguiente forma:

root@a4e0700b13e7:/# sdk default java 8u152-zulu

Default java version set to 8u152-zulu
root@a4e0700b13e7:/#

Con esto cubrimos de manera muy descriptiva el proceso de instalación de diferentes versiones de jdk.  A continuación veremos dos ejemplos, de manera mas resumida.

Practicando con Maven

root@a4e0700b13e7:/# sdk list maven

================================================================================
Available Maven Versions
================================================================================
     3.5.2                                                                         
     3.5.0                                                                         
     3.3.9                                                                         
================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
root@a4e0700b13e7:/# sdk install maven 3.5.2

Downloading: maven 3.5.2

In progress...

######################################################################## 100.0%

Installing: maven 3.5.2
Done installing!

root@a4e0700b13e7:/# sdk install maven 3.3.9

Downloading: maven 3.3.9

In progress...

######################################################################## 100.0%

Installing: maven 3.3.9
Done installing!

root@a4e0700b13e7:/# sdk use maven 3.5.2
Setting maven version 3.5.2 as default.

Using maven version 3.5.2 in this shell.
root@a4e0700b13e7:/# sdk use maven 3.3.9

Using maven version 3.3.9 in this shell.
root@a4e0700b13e7:/# mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T16:41:47+00:00)
Maven home: /root/.sdkman/candidates/maven/3.3.9
Java version: 1.8.0_152, vendor: Azul Systems, Inc.
Java home: /root/.sdkman/candidates/java/8u152-zulu/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "4.13.0-32-generic", arch: "amd64", family: "unix"
root@a4e0700b13e7:/#

Practicando con Gradle

root@a4e0700b13e7:/# sdk list gradle 

================================================================================
Available Gradle Versions
================================================================================
     4.6-rc-2             4.3.1                3.5                  2.2.1          
     4.6-rc-1             4.3-rc-4             3.4.1                2.2            
     4.6                  4.3-rc-3             3.4                  2.14.1         
     4.5.1                4.3-rc-2             3.3                  2.14           
     4.5-rc-2             4.3-rc-1             3.2.1                2.13           
     4.5-rc-1             4.3                  3.2                  2.12           
     4.5                  4.2.1                3.1                  2.11           
     4.4.1                4.2-rc-2             3.0                  2.10           
     4.4-rc-6             4.2-rc-1             2.9                  2.1            
     4.4-rc-5             4.2                  2.8                  2.0            
     4.4-rc-4             4.1                  2.7                  1.9            
     4.4-rc-3             4.0.2                2.6                  1.8            
     4.4-rc-2             4.0.1                2.5                  1.7            
     4.4-rc-1             4.0                  2.4                  1.6            
     4.4                  3.5.1                2.3                  1.5            

================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
root@a4e0700b13e7:/# sdk install gradle 4.6
root@a4e0700b13e7:/# sdk install gradle 4.5
root@a4e0700b13e7:/# sdk use gradle 4.6

Using gradle version 4.6 in this shell.
root@a4e0700b13e7:/# gradle -v

------------------------------------------------------------
Gradle 4.6
------------------------------------------------------------

Build time:   2018-02-28 13:36:36 UTC
Revision:     8fa6ce7945b640e6168488e4417f9bb96e4ab46c

Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM:          1.8.0_152 (Azul Systems, Inc. 25.152-b16)
OS:           Linux 4.13.0-32-generic amd64

root@a4e0700b13e7:/# sdk use gradle 4.5

Using gradle version 4.5 in this shell.
root@a4e0700b13e7:/# gradle -v

------------------------------------------------------------
Gradle 4.5
------------------------------------------------------------

Build time:   2018-01-24 17:04:52 UTC
Revision:     77d0ec90636f43669dc794ca17ef80dd65457bec

Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM:          1.8.0_152 (Azul Systems, Inc. 25.152-b16)
OS:           Linux 4.13.0-32-generic amd64

root@a4e0700b13e7:/#

Es posible que tanto gradle, maven o cualquier otra herramienta basada en java e instalada con sdk necesiten cerrar el terminal actual, abrir uno nuevo o recompilar el fichero .bashrc o .bash_profile:

root@a4e0700b13e7:/# source ~/.bashrc

Espero que este documento sea de ayuda y sobre todo recomiendo que NO se utilize sdkman como una alternativa para NO actualizar las dependencias de tu proyecto.

A %d blogueros les gusta esto: