Instalar GraalVM


En este post vamos a instalar GraalVM para compilar imágenes nativas, en este caso preparar el ambiente para compilar aplicaciones Java

oscar Escrito por oscar 19 May 2023 383 0

Requisitos

En esta practica, para instalar GraalVM la trabajaremos con el sistema operativo Linux

Maquinas virtual o Alguna distribución linux

  1. Sistema operativo Linux (compatible con x86_64 o AArch64).
  2. Tarjeta gráfica compatible con OpenGL 2.0 (para la interfaz de usuario GraalVM VisualVM).

Aprovisionar maquina virtual

Crearemos una maquina virtual con ubuntu 2004 la cual tendrá las siguientes caracteristicas:

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64" # Ubuntu 20.04 box
  config.vm.hostname = "graalvm"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "4096" # 4 GB de RAM
    vb.cpus = 3 # 3 procesadores
  end

  config.vm.network "private_network", ip: "192.168.33.10"

end
  • 4 Gb de RAM
  • 3 cpus

Los detalles de este aprovisionamiento los explico mas adelante

Java

Procedemos a instalar Java JDK version 17, se pueden guiar con este posts Instalar java 17 en ubuntu | CodigoElectronica

Instalar GraalVM

Descargar

Vamos a descargar la ultima versión de GraalVM para Java 17, el link de descarga lo encontramos en GraalVM Community Edition

wget https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.2/graalvm-ce-java17-linux-amd64-22.3.2.tar.gz

Movemos el archivo recien descargado a la carpeta ´/usr/lib/jvm/´, pero antes verificamos que no exista.

ls /usr/lib/jvm/

Respuesta:

java-1.17.0-openjdk-amd64  java-17-openjdk-amd64  openjdk-17

Procedemos a mover el archivo ´graalvm-ce-java17-linux-amd64-22.3.2.tar.gz´.

sudo mv graalvm-ce-java17-linux-amd64-22.3.2.tar.gz /usr/lib/jvm/

Luego extraemos el contenido del archivo ´graalvm-ce-java17-linux-amd64-22.3.2.tar.gz´, primero nos movemos al directorio:

cd /usr/lib/jvm
sudo tar -xvzf graalvm-ce-java17-linux-amd64-22.3.2.tar.gz

Despues de extraer el contenido, podemos eliminar el archivo ´graalvm-ce-java17-linux-amd64-22.3.2.tar.gz´ para no tener basura.

sudo rm graalvm-ce-java17-linux-amd64-22.3.2.tar.gz

Nos debe de quedar de la siguiente forma

vagrant@ubuntu-focal:/usr/lib/jvm$ ls
graalvm-ce-java17-22.3.2  java-1.17.0-openjdk-amd64  java-17-openjdk-amd64  openjdk-17

Creamos un enlace simbólico a graalvm 

sudo ln -s graalvm-ce-java17-22.3.2 graalvm

Configurar

Vamos a realiza la configuración para usar graalvm.

Primero vamos a obtener el listado de diferentes versiones de java instadas, para ello ejecutamos el siguiente comando.

update-alternatives --config java

Podemos ver en la respuesta que solo tenemos la instalación de java que realiza mos hace poco:

There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-17-openjdk-amd64/bin/java
Nothing to configure.

Ahora, vamos a añadir a las alternativa de java, la versión que viene con graalvm, esto lo realizamos de la siguiente forma:

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/graalvm/bin/java 2

Volvemos a realizar la impresión del listado de versiones de Java;

sudo update-alternatives --config java

Donde ahora nos indicara que tenemos varias versiones y una de ellas es la versión que esta con graalvm.

En este paso se habilitara un promp, donde pedirá seleccionar que versión de Java usaremos, como la versión de graalvm esta en la posición 1, escribimos ese número y damos en enter.

vagrant@ubuntu-focal:/usr/lib/jvm$ sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                         Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      auto mode
  1            /usr/lib/jvm/graalvm/bin/java                 2         manual mode
  2            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      manual mode

Press <enter> to keep the current choice[*], or type selection number: 1

Procedemos a ver la versión de java instalada para comprobar que sea la de graalvm:

java -version

Resultado:

openjdk version "17.0.7" 2023-04-18
OpenJDK Runtime Environment GraalVM CE 22.3.2 (build 17.0.7+7-jvmci-22.3-b18)
OpenJDK 64-Bit Server VM GraalVM CE 22.3.2 (build 17.0.7+7-jvmci-22.3-b18, mixed mode, sharing)

Modificar los enviroments

Procedemos a cambiar la configuracion del PATH y del JAVA_HOME para que reconozcan a graalvm y el comando GU, para ello realizamos lo siguiente:

sudo nano /etc/environment

Agregamos lo siguiente:

  1. A la Variable path, al final de la cadena agregamos dos puntos ':' para separar el texto y colocamos '/usr/lib/jvm/graalvm/bin' que es la ruta de los comandos de graalvm.
  2. Cambiamos la ruta de JAVA_HOME por '/usr/lib/jvm/graalvm' que es donde esta los nuevos comandos de graalvm

Nota: debe tener cuidado con lo que ya tiene PATH, no se debe eliminar ni alterar esta cadena, lo que se debe hacer es agregar al final las nuevas rutas que deseamos añadir para los binarios.

Deberá quedar de la siguiente forma:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/jvm/graalvm/bin:/usr/lib/jvm/graalvm/lib/svm/bin"
JAVA_HOME="/usr/lib/jvm/graalvm"

Luego fuerce el terminal de Ubuntu para volver a cargar el archivo de configuración del entorno:

source /etc/environment

Realizamos varias pruebas, primero ver el contenido de $JAVA_HOME

echo $JAVA_HOME

Respuesta: /usr/lib/jvm/graalvm

Luego veremos si el comando gu de graalvm funciona:

gu --version

Respuesta: GraalVM Updater 22.3.2

Instalación de native-image

Realizamos la instalación de la siguiente forma:

sudo /usr/lib/jvm/graalvm/bin/gu install native-image

Nota: realizamos la instalación de esta forma, colocando la ruta directa del binario de gu, ya que se debe añador este bin a los permisos de root, esto lo explico mas abajo.

Listamos los componentes de graalvm

gu list

Respuesta:

ComponentId              Version             Component name                Stability                     Origin
---------------------------------------------------------------------------------------------------------------------------------
graalvm                  22.3.2              GraalVM Core                  Supported
native-image             22.3.2              Native Image                  Early adopter                 github.com

Donde podemos ver que native-image se a instalado correctamente, tambien podemos ver su versión de la siguiente forma:

native-image --version

Respuesta: GraalVM 22.3.2 Java 17 CE (Java Version 17.0.7+7-jvmci-22.3-b18)

Con la siguiente instrucción, vemos los componentes habilitados en graalvm:

gu available

Respuesta

Downloading: Component catalog from www.graalvm.org
ComponentId              Version             Component name                Stability                     Origin 
---------------------------------------------------------------------------------------------------------------------------------
espresso                 22.3.2              Java on Truffle               Supported                     github.com
espresso-llvm            22.3.2              Java on Truffle LLVM Java librSupported                     github.com
js                       22.3.2              Graal.js                      Supported                     github.com
llvm                     22.3.2              LLVM Runtime Core             Supported                     github.com
llvm-toolchain           22.3.2              LLVM.org toolchain            Supported                     github.com
native-image             22.3.2              Native Image                  Early adopter                 github.com
native-image-llvm-backend22.3.2              Native Image LLVM Backend     Early adopter (experimental)  github.com
nodejs                   22.3.2              Graal.nodejs                  Supported                     github.com
visualvm                 22.3.2              VisualVM                      Supported                     github.com

Configuraciones adicionales

¿No puede usar el comando gu?

Si no puede usar el comando directamente, debe agregar al comportamiento de Bash, la siguiente configuración, abrimos el archivo bashrc:

sudo nano ~/.bashrc

Al final del archivo, agregamos lo siguiente:

export PATH=$PATH:/usr/lib/jvm/graalvm/bin

Nota: si en la configuración del `/etc/environment` mencionada anteriormente a quedado correcta, no deberá realizar este paso.

Recursos adicionales

GitHub - swseighman/Installing-GraalVM-Enterprise-Edition

Installation on Linux Platforms (graalvm.org)

Guide to Install GraalVM Community Edition on Ubuntu - DEV Community

Si se presenta el error "/usr/bin/ld: cannot find -lz" la solucion es la siguiente Spring Native fails to Execute org.graalvm.buildtools - Stack Overflo

Build a Micronaut Application into a Native Executable (graalvm.org)

GraalVM Native Image Tips & Tricks - James Ward

Error: Image build request failed with exit status 137 - Linux Mint · Issue #10318 · quarkusio/quarkus · GitHub

Comandos adicionales

wget https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.0.0/graalvm-ce-java8-linux-amd64-20.0.0.tar.gz
which java
/usr/lib/jvm/graalvm/bin/java
echo 'export PATH=/usr/lib/jvm/graalvm-ce-java11-22.3.2/bin:$PATH' >> ~/.bashrc

echo 'export JAVA_HOME=/usr/lib/jvm/graalvm-ce-java11-22.3.2' >> ~/.bashrc

 


Comentario

Debe aceptar antes de enviar