Requisitos
En esta practica, para instalar GraalVM la trabajaremos con el sistema operativo Linux
Maquinas virtual o Alguna distribución linux
- Sistema operativo Linux (compatible con x86_64 o AArch64).
- 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:
- 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.
- 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
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