Comment changer facilement de version du JDK sous Linux ?
Alors que j’étais en train de développer en Java il y a quelques jours, j’ai eu besoin de passer du JDK 7 au JDK 8, toutes deux installées sur ma machine Ubuntu. Et là c’est le drame, comme ça ne m’arrive pas souvent, et que la mémoire n’est pas mon fort, il a fallu que je cherche… Je me suis dit que la réponse pourrait intéresser d’autres personnes, et au pire me servir de pense-bete !
La première option qui vient à l’esprit, c’est d’utiliser la commande update-alternatives
qui permet de passer d’une alternative à une autre pour une commande donnée via des liens symboliques.
Par exemple, en tapant update-alternatives --config java
, vous devriez voir une liste des alternatives disponibles dans le système (en tous cas celle que le système connait…):
Sélection Chemin Priorité État
------------------------------------------------------------
0 /usr/lib/jvm/java-8-oracle/jre/bin/java 13 mode automatique
1 /usr/lib/jvm/java-7-oracle/jre/bin/java 12 mode manuel
* 2 /usr/lib/jvm/java-8-oracle/jre/bin/java 13 mode manuel
A partir de là on peut en choisir une qui sera utilisée quand on fera java monprogramme
.
C’est un bon début, mais le problème avec Java, c’est que le JDK est en réalité composée d’une kyrielle de commandes: java
, javac
, javap
, etc…
Il est évidemment très pénible de se taper update-alternatives
pour chacune d’elles.
Heureusement, quelqu’un (béni soit-il) a pensé à nous et la commande update-java-alternatives
permet de modifier d’un coup la version de l’ensemble des programmes du JDK.
Encore mieux donc, mais il manque encore un petit quelque chose: quand on développe en java, on utilise souvent la variable système JAVA_HOME
qui pointe sur le répertoire d’installation du JDK. Or la valeur de cette variable n’est pas mise à jour par update-java-alternatives
… Faut-il le faire à la main ?
Là encore en cherchant un peu, on peut faire mieux: au lieu de mettre en dur un chemin dans .bashrc
(c’est là que je positionne cette variable), on peut faire ceci:
JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
Pas besoin d’être un gourou du shell pour comprendre qu’on récupère la valeur du lien symbolique javac
et qu’on en déduit via une petite manipulation du chemin la valeur de JAVA_HOME
(je ne l’ai pas inventé, je l’ai trouvé sur serverfault).
Voilà, la variable sera positionnée correctement pourvu que l’on aie pensé à exécuter le script, par exemple en ouvrant simplement un nouveau terminal.