L'installation d'une distribution Java sur un Raspberry Pi 4 peut se faire de différente manière. Cela dépend de la distribution Java choisie, car plusieurs distribution sont disponibles sur ARM 32 et 64 bits. Le plus simple est d'installer les distributions proposées dans le gestionnaire de packages apt.
Pré-installation
Pour vérifier si Java est présent, il faut faut exécuter la commande :
jm@rpi4-ubuntu:~$ java -version
Command 'java' not found, but can be installed with:
sudo apt install default-jre????????????? # version 2:1.11-72, or
sudo apt install openjdk-11-jre-headless? # version 11.0.9.1+1-0ubuntu1~20.10
sudo apt install openjdk-8-jre-headless?? # version 8u275-b01-0ubuntu1~20.10
sudo apt install openjdk-13-jre-headless? # version 13.0.4+8-1
sudo apt install openjdk-14-jre-headless? # version 14.0.2+12-1
sudo apt install openjdk-15-jre-headless? # version 15+36-1
La première étape consiste à mettre à jour l'index des packages :
jm@rpi4-ubuntu:~$ sudo apt update
[sudo] password for jm:
Installer le JRE par défaut
La version par défaut au moment de l'exécution de la commande est un OpenJDK 11. Le JRE par défaut s'installe en installant le package default-jre.
jm@rpi4-ubuntu:~$ sudo apt install default-jre
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
cryptsetup-bin dctrl-tools dmeventd dmraid dpkg-repack efibootmgr gir1.2-timezonemap-1.0 gir1.2-xkl-1.0
grub-common grub-efi-arm64 grub-efi-arm64-bin grub-efi-arm64-signed grub2-common kpartx kpartx-boot
libdebian-installer4 libdevmapper-event1.02.1 libdmraid1.0.0.rc16 liblvm2cmd2.03 libreadline5
libtimezonemap-data libtimezonemap1 lvm2 os-prober python3-icu python3-pam rdate thin-provisioning-tools
Veuillez utiliser ? sudo apt autoremove ? pour les supprimer.
Les paquets supplémentaires suivants seront installés :
ca-certificates-java default-jre-headless fonts-dejavu-extra java-common libatk-wrapper-java
libatk-wrapper-java-jni openjdk-11-jre openjdk-11-jre-headless
Paquets suggérés :
fonts-ipafont-gothic fonts-ipafont-mincho fonts-wqy-microhei | fonts-wqy-zenhei
Les NOUVEAUX paquets suivants seront installés :
ca-certificates-java default-jre default-jre-headless fonts-dejavu-extra java-common libatk-wrapper-java
libatk-wrapper-java-jni openjdk-11-jre openjdk-11-jre-headless
0 mis à jour, 9 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 39,0 Mo dans les archives.
Après cette opération, 177 Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] O
Réception de :1 http://ports.ubuntu.com/ubuntu-ports groovy/main arm64 java-common all 0.72 [6?816 B]
Réception de :2 http://ports.ubuntu.com/ubuntu-ports groovy-updates/main arm64 openjdk-11-jre-headless arm64 11.0.9.1+1-0ubuntu1~20.10 [36,9 MB]
Réception de :3 http://ports.ubuntu.com/ubuntu-ports groovy/main arm64 default-jre-headless arm64 2:1.11-72 [3?192 B]
?
Traitement des actions différées (? triggers ?) pour fontconfig (2.13.1-2ubuntu3) ...
Traitement des actions différées (? triggers ?) pour desktop-file-utils (0.24-1ubuntu4) ...
Traitement des actions différées (? triggers ?) pour mime-support (3.64ubuntu1) ...
Traitement des actions différées (? triggers ?) pour hicolor-icon-theme (0.17-2) ...
Traitement des actions différées (? triggers ?) pour gnome-menus (3.36.0-1ubuntu1) ...
Traitement des actions différées (? triggers ?) pour man-db (2.9.3-2) ...
Traitement des actions différées (? triggers ?) pour ca-certificates (20201027ubuntu0.20.10.1) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
Done.
La vérification de la version installée se fait en executant la commande :
jm@rpi4-ubuntu:~$ java -version
openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.10)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.10, mixed mode)
jm@rpi4-ubuntu:~$
Installer le JDK par défaut
Le JDK par défaut s'installe en installant le package default-jdk.
jm@rpi4-ubuntu:~$ sudo apt install default-jdk
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances??????
Lecture des informations d'état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
cryptsetup-bin dctrl-tools dmeventd dmraid dpkg-repack efibootmgr gir1.2-timezonemap-1.0 gir1.2-xkl-1.0
grub-common grub-efi-arm64 grub-efi-arm64-bin grub-efi-arm64-signed grub2-common kpartx kpartx-boot
libdebian-installer4 libdevmapper-event1.02.1 libdmraid1.0.0.rc16 liblvm2cmd2.03 libreadline5
libtimezonemap-data libtimezonemap1 lvm2 os-prober python3-icu python3-pam rdate thin-provisioning-tools
Veuillez utiliser ? sudo apt autoremove ? pour les supprimer.
Les paquets supplémentaires suivants seront installés :
default-jdk-headless libice-dev libpthread-stubs0-dev libsm-dev libx11-dev libxau-dev libxcb1-dev
libxdmcp-dev libxt-dev openjdk-11-jdk openjdk-11-jdk-headless x11proto-core-dev x11proto-dev
xorg-sgml-doctools xtrans-dev
Paquets suggérés :
libice-doc libsm-doc libx11-doc libxcb-doc libxt-doc openjdk-11-demo openjdk-11-source visualvm
Les NOUVEAUX paquets suivants seront installés :
default-jdk default-jdk-headless libice-dev libpthread-stubs0-dev libsm-dev libx11-dev libxau-dev
libxcb1-dev libxdmcp-dev libxt-dev openjdk-11-jdk openjdk-11-jdk-headless x11proto-core-dev x11proto-dev
xorg-sgml-doctools xtrans-dev
0 mis à jour, 16 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 219 Mo dans les archives.
Après cette opération, 234 Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] O
Réception de :1 http://ports.ubuntu.com/ubuntu-ports groovy-updates/main arm64 openjdk-11-jdk-headless arm64 11.0.9.1+1-0ubuntu1~20.10 [215 MB]
Réception de :2 http://ports.ubuntu.com/ubuntu-ports groovy/main arm64 default-jdk-headless arm64 2:1.11-72 [1?140 B]
Réception de :3 http://ports.ubuntu.com/ubuntu-ports groovy-updates/main arm64 openjdk-11-jdk arm64 11.0.9.1+1-0ubuntu1~20.10 [2?048 kB]
?
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jar ? pour fournir ? /usr/bin/jar ? (jar) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jarsigner ? pour fournir ? /usr/bin/jarsigner ? (jarsigner) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/javac ? pour fournir ? /usr/bin/javac ? (javac) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/javadoc ? pour fournir ? /usr/bin/javadoc ? (javadoc) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/javap ? pour fournir ? /usr/bin/javap ? (javap) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jcmd ? pour fournir ? /usr/bin/jcmd ? (jcmd) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jdb ? pour fournir ? /usr/bin/jdb ? (jdb) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jdeprscan ? pour fournir ? /usr/bin/jdeprscan ? (jdeprscan) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jdeps ? pour fournir ? /usr/bin/jdeps ? (jdeps) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jimage ? pour fournir ? /usr/bin/jimage ? (jimage) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jinfo ? pour fournir ? /usr/bin/jinfo ? (jinfo) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jlink ? pour fournir ? /usr/bin/jlink ? (jlink) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jmap ? pour fournir ? /usr/bin/jmap ? (jmap) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jmod ? pour fournir ? /usr/bin/jmod ? (jmod) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jps ? pour fournir ? /usr/bin/jps ? (jps) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jrunscript ? pour fournir ? /usr/bin/jrunscript ? (jrunscript) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jshell ? pour fournir ? /usr/bin/jshell ? (jshell) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jstack ? pour fournir ? /usr/bin/jstack ? (jstack) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jstat ? pour fournir ? /usr/bin/jstat ? (jstat) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jstatd ? pour fournir ? /usr/bin/jstatd ? (jstatd) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/rmic ? pour fournir ? /usr/bin/rmic ? (rmic) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/serialver ? pour fournir ? /usr/bin/serialver ? (serialver) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jaotc ? pour fournir ? /usr/bin/jaotc ? (jaotc) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jhsdb ? pour fournir ? /usr/bin/jhsdb ? (jhsdb) en mode automatique
Paramétrage de libpthread-stubs0-dev:arm64 (0.4-1) ...
Paramétrage de xtrans-dev (1.4.0-1) ...
Paramétrage de default-jdk-headless (2:1.11-72) ...
Paramétrage de openjdk-11-jdk:arm64 (11.0.9.1+1-0ubuntu1~20.10) ...
update-alternatives: utilisation de ? /usr/lib/jvm/java-11-openjdk-arm64/bin/jconsole ? pour fournir ? /usr/bin/jconsole ? (jconsole) en mode automatique
Paramétrage de xorg-sgml-doctools (1:1.11-1) ...
Paramétrage de default-jdk (2:1.11-72) ...
Traitement des actions différées (? triggers ?) pour man-db (2.9.3-2) ...
Traitement des actions différées (? triggers ?) pour sgml-base (1.30) ...
Paramétrage de x11proto-dev (2020.1-1) ...
Paramétrage de libxau-dev:arm64 (1:1.0.9-0ubuntu1) ...
Paramétrage de libice-dev:arm64 (2:1.0.10-1) ...
Paramétrage de libsm-dev:arm64 (2:1.2.3-1) ...
Paramétrage de libxdmcp-dev:arm64 (1:1.1.3-0ubuntu1) ...
Paramétrage de x11proto-core-dev (2020.1-1) ...
Paramétrage de libxcb1-dev:arm64 (1.14-2) ...
Paramétrage de libx11-dev:arm64 (2:1.6.12-1) ...
Paramétrage de libxt-dev:arm64 (1:1.2.0-1) ...
jm@rpi4-ubuntu:~$
La vérification de la version du JDK installée se fait en executant la commande :
jm@rpi4-ubuntu:~$ javac -version
javac 11.0.9.1
jm@rpi4-ubuntu:~$
Installation d'une autre version
Par défaut pour une Ubuntu 20.10, le repository standard propose plusieurs versions d'OpenJDK.
Pour obtenir la liste des version disponibles, il faut faire une recherche sur openjdk dans les packages.
jm@rpi4-ubuntu:~$ apt search openjdk
Pour installer une version parmis celles de la liste, il suffit d'exécuter la commande pour le package de la version concernée
jm@rpi4-ubuntu:~$ sudo apt install openjdk-8-jdk
jm@rpi4-ubuntu:~$ sudo apt install openjdk-11-jdk
jm@rpi4-ubuntu:~$ sudo apt install openjdk-13-jdk
jm@rpi4-ubuntu:~$ sudo apt install openjdk-14-jdk
L'installation d'un JDK 8
L'installation d'un OpenJDK version 8 se fait en installant le package openjdk-8-jdk
jm@rpi4-ubuntu:~$ sudo apt-get install openjdk-8-jdk
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances??????
Lecture des informations d'état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
cryptsetup-bin dctrl-tools dmeventd dmraid dpkg-repack efibootmgr gir1.2-timezonemap-1.0 gir1.2-xkl-1.0 grub-common
grub-efi-arm64 grub-efi-arm64-bin grub-efi-arm64-signed grub2-common kpartx kpartx-boot libdebian-installer4
libdevmapper-event1.02.1 libdmraid1.0.0.rc16 liblvm2cmd2.03 libreadline5 libtimezonemap-data libtimezonemap1 lvm2 os-prober
python3-icu python3-pam rdate thin-provisioning-tools
Veuillez utiliser ? sudo apt autoremove ? pour les supprimer.
Les paquets supplémentaires suivants seront installés :
openjdk-8-jdk-headless openjdk-8-jre openjdk-8-jre-headless
Paquets suggérés :
openjdk-8-demo openjdk-8-source visualvm icedtea-8-plugin fonts-ipafont-gothic fonts-ipafont-mincho fonts-wqy-microhei
fonts-wqy-zenhei
Les NOUVEAUX paquets suivants seront installés :
openjdk-8-jdk openjdk-8-jdk-headless openjdk-8-jre openjdk-8-jre-headless
0 mis à jour, 4 nouvellement installés, 0 à enlever et 6 non mis à jour.
Il est nécessaire de prendre 40,3 Mo dans les archives.
Après cette opération, 147 Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] O
Réception de :1 http://ports.ubuntu.com/ubuntu-ports groovy-updates/universe arm64 openjdk-8-jre-headless arm64 8u275-b01-0ubuntu1~20.10 [27,8 MB]
Réception de :2 http://ports.ubuntu.com/ubuntu-ports groovy-updates/universe arm64 openjdk-8-jre arm64 8u275-b01-0ubuntu1~20.10 [65,5 kB]
Réception de :3 http://ports.ubuntu.com/ubuntu-ports groovy-updates/universe arm64 openjdk-8-jdk-headless arm64 8u275-b01-0ubuntu1~20.10 [8?291 kB]
Réception de :4 http://ports.ubuntu.com/ubuntu-ports groovy-updates/universe arm64 openjdk-8-jdk arm64 8u275-b01-0ubuntu1~20.10 [4?116 kB]
40,3 Mo réceptionnés en 7s (5?409 ko/s)???????????????????????????????????????????????????????????????????????????????????????
Sélection du paquet openjdk-8-jre-headless:arm64 précédemment désélectionné.
(Lecture de la base de données... 169868 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../openjdk-8-jre-headless_8u275-b01-0ubuntu1~20.10_arm64.deb ...
Dépaquetage de openjdk-8-jre-headless:arm64 (8u275-b01-0ubuntu1~20.10) ...
Sélection du paquet openjdk-8-jre:arm64 précédemment désélectionné.
Préparation du dépaquetage de .../openjdk-8-jre_8u275-b01-0ubuntu1~20.10_arm64.deb ...
Dépaquetage de openjdk-8-jre:arm64 (8u275-b01-0ubuntu1~20.10) ...
Sélection du paquet openjdk-8-jdk-headless:arm64 précédemment désélectionné.
Préparation du dépaquetage de .../openjdk-8-jdk-headless_8u275-b01-0ubuntu1~20.10_arm64.deb ...
Dépaquetage de openjdk-8-jdk-headless:arm64 (8u275-b01-0ubuntu1~20.10) ...
Sélection du paquet openjdk-8-jdk:arm64 précédemment désélectionné.
Préparation du dépaquetage de .../openjdk-8-jdk_8u275-b01-0ubuntu1~20.10_arm64.deb ...
Dépaquetage de openjdk-8-jdk:arm64 (8u275-b01-0ubuntu1~20.10) ...
Paramétrage de openjdk-8-jre-headless:arm64 (8u275-b01-0ubuntu1~20.10) ...
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/jre/bin/orbd ? pour fournir ? /usr/bin/orbd ? (orbd) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/jre/bin/servertool ? pour fournir ? /usr/bin/servertool ? (servertool) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/jre/bin/tnameserv ? pour fournir ? /usr/bin/tnameserv ? (tnameserv) en mode automatique
Paramétrage de openjdk-8-jre:arm64 (8u275-b01-0ubuntu1~20.10) ...
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/jre/bin/policytool ? pour fournir ? /usr/bin/policytool ? (policytool) en mode automatique
Paramétrage de openjdk-8-jdk-headless:arm64 (8u275-b01-0ubuntu1~20.10) ...
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/clhsdb ? pour fournir ? /usr/bin/clhsdb ? (clhsdb) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/extcheck ? pour fournir ? /usr/bin/extcheck ? (extcheck) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/hsdb ? pour fournir ? /usr/bin/hsdb ? (hsdb) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/idlj ? pour fournir ? /usr/bin/idlj ? (idlj) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/javah ? pour fournir ? /usr/bin/javah ? (javah) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/jhat ? pour fournir ? /usr/bin/jhat ? (jhat) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/jsadebugd ? pour fournir ? /usr/bin/jsadebugd ? (jsadebugd) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/native2ascii ? pour fournir ? /usr/bin/native2ascii ? (native2ascii) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/schemagen ? pour fournir ? /usr/bin/schemagen ? (schemagen) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/wsgen ? pour fournir ? /usr/bin/wsgen ? (wsgen) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/wsimport ? pour fournir ? /usr/bin/wsimport ? (wsimport) en mode automatique
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/xjc ? pour fournir ? /usr/bin/xjc ? (xjc) en mode automatique
Paramétrage de openjdk-8-jdk:arm64 (8u275-b01-0ubuntu1~20.10) ...
update-alternatives: utilisation de ? /usr/lib/jvm/java-8-openjdk-arm64/bin/appletviewer ? pour fournir ? /usr/bin/appletviewer ? (appletviewer) en mode automatique
Traitement des actions différées (? triggers ?) pour mime-support (3.64ubuntu1) ...
Traitement des actions différées (? triggers ?) pour hicolor-icon-theme (0.17-2) ...
Traitement des actions différées (? triggers ?) pour gnome-menus (3.36.0-1ubuntu1) ...
Traitement des actions différées (? triggers ?) pour libc-bin (2.32-0ubuntu3) ...
Traitement des actions différées (? triggers ?) pour desktop-file-utils (0.24-1ubuntu4) ...
jm@rpi4-ubuntu:~$
La variable d'environnement JAVA_HOME
Certaines applications recherchent la variable d'environnement JAVA_HOME pour conna?tre la localisation du JDK.
jm@rpi4-ubuntu:~$ export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64
jm@rpi4-ubuntu:~$ echo $JAVA_HOME
/usr/lib/jvm/java-8-openjdk-arm64
jm@rpi4-ubuntu:~$
Il est possible de configurer la variable d'environnement JAVA_HOME avec un chemin en dur au démarrage du système en modifiant le fichier /etc/environment
jm@rpi4-ubuntu:~$ sudo nano /etc/environment
Il suffit de rajouter la ligne
JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"
Il faut enregistrer les modifications et appliquer les modifications dans la session courante
jm@rpi4-ubuntu:~$ source /etc/environment
jm@rpi4-ubuntu:~$
Il est possible de définir la variable en obtenant dynamiquement le chemin de la commande java. C'est pratique après avoir changer les alternatives pour les commandes du JDK ou du JRE.
jm@rpi4-ubuntu:~$ export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
jm@rpi4-ubuntu:~$ echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-arm64
Il est possible de définir la variable JAVA_HOME avec comme valeur un chemin en dur dans le fichier /etc/environment pour définir la valeur par défaut.
Il est possible de définir dynamiquement dans le fichier ~/.bashrc en lui ajoutant la ligne
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
La configuration de la version utilisée
Plusieurs sont utilisables pour configurer la version de Java à utiliser par défaut.
La commande update-alternatives
Les alternatives sont une solution proposée par les systèmes reposant sur une Debian pour plusieurs programmes qui remplissent des fonctions identiques ou similaires soient listés comme des implémentations alternatives qui sont installées simultanément avec une implémentation particulière désignée comme implémentation par défaut.
Les alternatives sont gérées avec la commande update-alternatives
Elle permet de sélectionner une alternative (une version particulière) pour une commande. La commande est alors un alias vers la commande correspondante de la version souhaitée.
jm@rpi4-ubuntu:~$ java -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-8u275-b01-0ubuntu1~20.10-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
jm@rpi4-ubuntu:~$ javac -version
javac 1.8.0_275
jm@rpi4-ubuntu:~$ sudo update-alternatives --config java
Il existe 3 choix pour l'alternative java (qui fournit /usr/bin/java).
Sélection?? Chemin????????????????????????????????????????? Priorité? état
------------------------------------------------------------
0??????????? /usr/lib/jvm/java-15-openjdk-arm64/bin/java????? 1511????? mode automatique
1??????????? /usr/lib/jvm/java-11-openjdk-arm64/bin/java????? 1111????? mode manuel
2??????????? /usr/lib/jvm/java-15-openjdk-arm64/bin/java????? 1511????? mode manuel
* 3??????????? /usr/lib/jvm/java-8-openjdk-arm64/jre/bin/java?? 1081????? mode manuel
Appuyez sur <Entrée> pour conserver la valeur par défaut[*] ou choisissez le numéro sélectionné :2
update-alternatives: utilisation de ? /usr/lib/jvm/java-15-openjdk-arm64/bin/java ? pour fournir ? /usr/bin/java ? (java) en mode manuel
jm@rpi4-ubuntu:~$ java -version
openjdk version "15" 2020-09-15
OpenJDK Runtime Environment (build 15+36-Ubuntu-1)
OpenJDK 64-Bit Server VM (build 15+36-Ubuntu-1, mixed mode, sharing)
jm@rpi4-ubuntu:~$ javac -version
javac 1.8.0_275
Il faut donc l'utiliser sur chaque commande concernée, notamment java et javac et éventuellement les autres commandes utilisée du JRE ou du JDK : javadoc, jlink, jarsigner, ...
Si une seule version de Java est installée, il n'y a rien à faire
jm@rpi4-ubuntu:~$ sudo update-alternatives --config java
Il n'existe qu'une ? alternative ? dans le groupe de liens java (qui fournit /usr/bin/java) : /usr/lib/jvm/java-11-openjdk-arm64/bin/java
Rien à configurer.
jm@rpi4-ubuntu:~$
La commande update-java-alternatives
Pour obtenir les différentes installations, il faut utiliser l'option -l ou --list
jm@rpi4-ubuntu:~$ update-java-alternatives --list
java-1.11.0-openjdk-arm64????? 1111?????? /usr/lib/jvm/java-1.11.0-openjdk-arm64
java-1.15.0-openjdk-arm64????? 1511?????? /usr/lib/jvm/java-1.15.0-openjdk-arm64
java-1.8.0-openjdk-arm64?????? 1081?????? /usr/lib/jvm/java-1.8.0-openjdk-arm64
jm@rpi4-ubuntu:~$ update-java-alternatives -l
java-1.11.0-openjdk-arm64????? 1111?????? /usr/lib/jvm/java-1.11.0-openjdk-arm64
java-1.15.0-openjdk-arm64????? 1511?????? /usr/lib/jvm/java-1.15.0-openjdk-arm64
java-1.8.0-openjdk-arm64?????? 1081?????? /usr/lib/jvm/java-1.8.0-openjdk-arm64
Pour définir la version par défaut à utiliser, il faut utiliser l'option -s suivi du nom de la version souhaitée (celle qui apprarait en premier dans la liste). La commande doit ?tre exécutée avec les privilèges root
jm@rpi4-ubuntu:~$ update-java-alternatives -s java-1.8.0-openjdk-arm64
update-java-alternatives: no root privileges
jm@rpi4-ubuntu:~$ sudo update-java-alternatives -s java-1.8.0-openjdk-arm64
[sudo] password for jm:
update-alternatives: erreur: pas d'alternatives pour mozilla-javaplugin.so
update-java-alternatives: plugin alternative does not exist: /usr/lib/jvm/java-8-openjdk-arm64/jre/lib/aarch64/IcedTeaPlugin.so
jm@rpi4-ubuntu:~$ java -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-8u275-b01-0ubuntu1~20.10-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
jm@rpi4-ubuntu:~$ javac -version
javac 1.8.0_275
L'avantage de cette commande est de changer les alternatives pour les commandes en une seule instructions
jm@rpi4-ubuntu:~$ java -version
openjdk version "15" 2020-09-15
OpenJDK Runtime Environment (build 15+36-Ubuntu-1)
OpenJDK 64-Bit Server VM (build 15+36-Ubuntu-1, mixed mode, sharing)
jm@rpi4-ubuntu:~$ javac -version
javac 1.8.0_275
jm@rpi4-ubuntu:~$ update-java-alternatives -s java-1.11.0-openjdk-arm64
update-java-alternatives: no root privileges
jm@rpi4-ubuntu:~$ sudo update-java-alternatives -s java-1.11.0-openjdk-arm64
update-alternatives: erreur: pas d'alternatives pour mozilla-javaplugin.so
jm@rpi4-ubuntu:~$ java -version
openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.10)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.10, mixed mode)
jm@rpi4-ubuntu:~$ javac -version
javac 11.0.9.1
L'utilisation d'un script pour changer de version
Il est possible de définir un script pour chaque version souhaitée qui change les alternatives et définit la variable JAVA_HOME
Exemple /opt/java/utils/java8.sh
sudo update-java-alternatives -s java-1.8.0-openjdk-arm64
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
export PATH=$PATH:$JAVA_HOME
java -version
Exemple /opt/java/utils/java11.sh
sudo update-java-alternatives -s java-1.11.0-openjdk-arm64
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
export PATH=$PATH:$JAVA_HOME
java -version
Ces fichiers doivent ?tre créer avec les privilèges root. Il est possible de définir des alias dans le fichier ~/.bash_aliases
alias java8='source /opt/java/utils/java8.sh'
alias java11='source /opt/java/utils/java11.sh'
Pour prendre en compte les modifications, il faut rédemmarer sa session ou exécuter la commande
jm@rpi4-ubuntu:~$ source ~/.bashrc
jm@rpi4-ubuntu:~$
Il suffit alors d'invoquer le script relatif à la version à utiliser
jm@rpi4-ubuntu:~$ java8
update-alternatives: erreur: pas d'alternatives pour mozilla-javaplugin.so
update-java-alternatives: plugin alternative does not exist: /usr/lib/jvm/java-8-openjdk-arm64/jre/lib/aarch64/IcedTeaPlugin.so
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-8u275-b01-0ubuntu1~20.10-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
jm@rpi4-ubuntu:~$ echo $JAVA_HOME
/usr/lib/jvm/java-8-openjdk-arm64/jre
jm@rpi4-ubuntu:~$ java11
update-alternatives: erreur: pas d'alternatives pour mozilla-javaplugin.so
openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.10)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.10, mixed mode)
jm@rpi4-ubuntu:~$ echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-arm64
jm@rpi4-ubuntu:~$