Fonctionnement des Alternatives

Les alternatives viennent de Debian et ont été porté sur RedHat. Elles permettent de gérer plusieurs versions d’exécutables.
On notera que Debian utilise la commande update-alternatives alors que RedHat utilise la commande alternatives.

Voici comment cela fonctionne. Des liens sont posés dans /usr/bin/ qui pointent chacun vers un autre lien dans /etc/alternatives/ qui pointe pointe enfin vers l’exécutable sélectionné par le service.

Pour expliquer cela, on va se pencher sur java.

Tout d’abord, regardons la version actuelle de java:

java -version

java version "1.7.0_95"
OpenJDK Runtime Environment (rhel-2.6.4.0.el6_7-x86_64 u95-b00)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)

Ici, on s’aperçoit que l’exécutable de java se trouve ici, /usr/bin/java :

which java

Il se trouve en faites que ce n’est qu’un lien symbolique pointant sur un autre point symbolique qui lui, pointera sur l’exécutable:

ls -l /usr/bin/java

lrwxrwxrwx. 1 root root 22  3 mars  10:16 /usr/bin/java -> /etc/alternatives/java

ls -l /etc/alternatives/java

lrwxrwxrwx. 1 root root 34  3 mars  10:16 /etc/alternatives/java -> /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java

Pour voir les alternatives présente pour la commande java:

alternatives --config java

Qui nous donne comme retour:

Il existe 2 programmes qui fournissent « java ».
Sélection Commande
-----------------------------------------------
*+1 /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
2 /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
Entrez pour garder la sélection courante [+] ou saisissez le numéro de type de sélection :

On peut voir que la commande java pointera sur l’exécutable « /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java » par le signe + devant, l’étoile correspond au choix par défaut (option –auto).

On va maintenant installer le JDK d’oracle pour modifier l’exécutable utilisé.
Maintenant que c’est installé on refait la commande suivante:

alternatives --config java

Et sur la sortie de la commande, on peut voir qu’il y a une nouvelle entrée:

Il existe 3 programmes qui fournissent « java ».
Sélection    Commande
-----------------------------------------------
*+ 1        /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
2           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
3           /usr/java/jdk1.8.0_72/jre/bin/java
Entrez pour garder la sélection courante [+] ou saisissez le numéro de type de sélection :3

On tape 3 pour sélectionner le JDK oracle.

On refait cette commande pour vérifier que cela à bien été pris en compte par alternatives:

alternatives --config java

Il existe 3 programmes qui fournissent « java ».
Sélection    Commande
-----------------------------------------------
*  1        /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
2           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
+3           /usr/java/jdk1.8.0_72/jre/bin/java
Entrez pour garder la sélection courante [+] ou saisissez le numéro de type de sélection :3

Et maintenant si on redemande à java sa version:

java -version

java version "1.8.0_72"
Java(TM) SE Runtime Environment (build 1.8.0_72-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode)

Il peut être aussi utile de spécifier toutes les dépendances (avec l’option —slave) lier à cette même commande.
Grâce à cela, si l’on change la version de la commande java, toutes les commandes slave seront changés également.

Syntaxe pour ajouter une dépendance:

alternatives --slave <lien de la commande alternatives> <nom> <chemin de l’exécutable souhaité>

Exemple pour ajouter une dépendance:

alternatives --slave /usr/bin/rmiregistry rmiregistry /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/rmiregistry

Pour valider tout cela, on termine par un export de la variable JAVA_HOME dans son PATH, via son .bashrc (ou celui de l’utilisateur qui utilisera la commande):

JAVA_HOME=/usr/java/jdk1.8.0_72
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH

Derniers Articles