installing GraalVM on non arch-linux distros

5 minute read

introduction

this post covers installing GraalVM on Linux distros that support update-alternatives command (i.e., Debian family, Red-Hat family, SuSE family).

for ArchLinux based distros, check the installing-graalvm-arch post


GraalVM is deemed to be a high performance runtime for java (and a few other languages)

although there is a claim of faster speeds on hotspot mode, GraalVM caught my attention mainly because of the native-image feature.
with native-image we could achieve extremely fast cold starts, and very low memory footprint.
both features combined, make java an interesting player in the serverless microservices arena (i.e. aws lambda)


download

we first need to download GraalVM. Their downloads page is here graalvm downloads
the page lists the latest versions and has some download links from github. Check the downloads page to get the latest updates

to download the latest (at the time of this post) version (v.21.1), go to this github url: graal-github-vm-21.1.0

let’s choose the J11 amd64 (or 16 if you feel experimental) link which will download the graalvm-ce-java11-linux-amd64-21.xxx.xxx.xxx.tar.gz. If you have another system or architecture, choose yours instead of amd64.

installation

open a terminal like:

  • KDE’s Konsole
  • GNOME’s Terminal

extracting the downloaded file

navigate to where you downloaded the file, in my case, the Downloads folder and extract the files from the compressed archive

# extract the file, in my case, from the Downloads folder
user@hostname:~$ cd ~/Downloads
user@hostname:~/Downloads$ tar -xvzf graalvm-ce-java11-linux-amd64-21.xxx.xxx.xxx.tar.gz

local configuration

in ubuntu distros the java sdks are usually installed under /usr/lib/jvm/. It’s tempting to install graalVM also into that folder, but I usually prefer to leave the system paths to be handled by proper installers that will maintain links and permissions automatically.

this local configuration makes my life easy, so here it is.

in you home directory, create a bin directory, and a jvm vm directory inside bin.

# creating a bin and a jvm directory inside it with a single command
user@hostname:~$ mkdir -p ~/bin/jvm

this will allow you to have all your manual jvm installations organized, similar as what the system does.

now move the extracted files from Downloads to you newly created ~/bin/java directory.

# moving the extracted files to ~/bin/jvm
user@hostname:~$ mv ~/Downloads/graalvm-ce-java11-21.xxx.xxx.xxx/ ~/bin/jvm/

now we are going to create a symlink to that graalvm version that will allow us to easily refer to it around the system

# creating a symlink of this version of GraalVM
user@hostname:~$ ln -s ~/bin/jvm/graalvm-ce-java11-21.0.0/ ~/bin/jvm/graalvm

# check that your directory and symlink are created and are correct, your ls -lh output should be similar
# that the one below
user@hostname:~$ ls -lh ~/bin/jvm
total 4.0K
lrwxrwxrwx  1 user user   25 Jan 30 22:52 graalvm -> graalvm-ce-java11-21.0.0/
drwxr-xr-x 10 user user 4.0K Jan 30 19:32 graalvm-ce-java11-21.0.0

updating .bashrc file

we are going to update the file .bashrc to simplify our lives when calling graal commands from the console, particularly, the graal update command gu, which will allow us to install graal software such as native-image, and the native-image command itself.

using a text editor add the lines below at the end of the .bashrc file, I will use vim

user@hostname:~$ vim ~/.bashrc

# add the lines below at the end of the file and save
# remember to replace YOUR_USER_HERE with your own username

# Add graal-vm installer to path
export PATH=$PATH:/home/YOUR_USER_HERE/bin/jvm/graalvm/lib/installer/bin

# Add graal native-image to path
export PATH=$PATH:/home/YOUR_USER_HERE/bin/jvm/graalvm/lib/svm/bin

# save the changes by pressing the escape key and then :q and enter
# now that you are back ot the prompt execute the command below so the change take effect without needing
# to close and reopen the terminal
user@hostname:~$ source .bashrc

adding graalVM as a java alternative

in order to use graal as a proper java alternative we are going to add it to the system like this.

let’s see how many java installations we already have

user@hostname:~$ update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-14-openjdk-amd64/bin/java      1411      auto mode
  2            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      manual mode
  3            /usr/lib/jvm/java-14-openjdk-amd64/bin/java      1411      manual mode
  4            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

we are going to add now graalVM java to the list, in my case I will use priority 1000, as long as u don’t use you’re ok.
the path will correspond to the ones you used at the beginning of this post

# install the graalVM alternative
# remember to replace YOUR_USER_HERE with your own username

user@hostname:~$ sudo update-alternatives --install /usr/bin/java java /home/YOUR_USER_HERE/bin/jvm/graalvm/bin/java 1000

# check now all java alternatives as before, you should see your newly added GraalVM alternative like below
There are 4 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-14-openjdk-amd64/bin/java      1411      auto mode
  1            /home/YOUR_USER_HERE/bin/jvm/graalvm/bin/java    1000      manual mode
  2            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      manual mode
  3            /usr/lib/jvm/java-14-openjdk-amd64/bin/java      1411      manual mode
  4            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

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

switching to GraalVM java alternative

as you can see above now we have GraalVM as a java alternative, but the system is still using the previously setup version (J14) to switch between versions just do this

# configure GraalVM as the active java alternative with the previous config option but as sudo
user@hostname:~$ sudo update-alternatives --config java

There are 4 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-14-openjdk-amd64/bin/java      1411      auto mode
  1            /home/YOUR_USER_HERE/bin/jvm/graalvm/bin/java    1000      manual mode
  2            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      manual mode
  3            /usr/lib/jvm/java-14-openjdk-amd64/bin/java      1411      manual mode
  4            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

# select the number of your GraalVM installation on the below prompt
Press <enter> to keep the current choice[*], or type selection number: 1

# run the command again to confirm GraalVM alternative is now selected, the asterix should be next to
# the GraalVM alternative
user@hostname:~$ update-alternatives --config java
There are 4 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-14-openjdk-amd64/bin/java      1411      auto mode
* 1            /home/YOUR_USER_HERE/bin/jvm/graalvm/bin/java    1000      manual mode
  2            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      manual mode
  3            /usr/lib/jvm/java-14-openjdk-amd64/bin/java      1411      manual mode
  4            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

# you can double check by querying the java version at the prompt like this
user@hostname:~$ java -version
openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment GraalVM CE 21.0.0 (build 11.0.10+8-jvmci-21.0-b06)
OpenJDK 64-Bit Server VM GraalVM CE 21.0.0 (build 11.0.10+8-jvmci-21.0-b06, mixed mode, sharing)

installing native-image

all set with GraalVM installation and configuration!

let’s now install native-image which is a powerful tool to convert jvm based apps into blazing fast start low memory footprint native images

if you followed all the above steps, particularly the one updating the .bashrc, you should be able to call the command gu

# let's install the native-image executable
user@hostname:~$ gu install native-image

# to make sure it is installed run the command below, you should get a similar output
user@hostname:~$ native-image --version
GraalVM Version 21.0.0 (Java Version 11.0.10+8-jvmci-21.0-b06)

you are now all set to start playing with GraalVM!!!

Updated: