JAVA par défaut, $ JAVA_HOME vs sudo update-alternatives –config java

Je suis sur Ubuntu et j’ai défini ce qui suit dans mon fichier ~/.bashrc :

 export JAVA_HOME=/opt/jdk1.8.0_91 export PATH=$JAVA_HOME/bin:$PATH 

et alors:

 echo $JAVA_HOME >/opt/jdk1.8.0_91 java -version >java version "1.8.0_91" >Java(TM) SE Runtime Environment (build 1.8.0_91-b14) >Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode) 

Au premier coup d’œil, la commande sudo update-alternatives --config java ne montrait pas mon Java manuellement installé, donc je l’ai installé sur la commande avec sudo update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_91 1 .

Maintenant, la commande sudo update-alternatives --config java la liste de toutes les versions Java installées comme ceci:

 0 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 1071 auto mode 1 /opt/jdk1.7.0_51/bin/java 1 manual mode * 2 /opt/jdk1.8.0_91 1 manual mode 3 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 manual mode 4 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 1071 manual mode 

Mais basculer entre ceux-ci en utilisant l’invite de sudo update-alternatives --config java n’affecte pas $JAVA_HOME , puis $java -version .

Ma question est la suivante: que fait exactement sudo update-alternatives --config java après avoir sudo update-alternatives --config java une autre alternative par rapport aux parameters de la variable $JAVA_HOME$ ?

Cela change seulement un lien symbolique situé (sur la plupart des dissortingbutions, je suppose) dans /etc/alternatives/java . Absolument AUCUN changement dans la variable d’environnement que vous avez définie $JAVA_HOME n’est fait.

Regardez d’abord d’où la commande est trouvée, vous pouvez faire:

 $which java /usr/bin/java 

La commande affiche /usr/bin/java dans ma dissortingbution Debian. Ce fichier est un lien symbolique qui pointe vers /etc/alternatives/java .

 $ls -l /usr/bin | grep java java -> /etc/alternatives/java 

Ensuite, vous suivez le lien symbolique:

 $ls -l /etc/alternatives/java /etc/alternatives/java -> /path/to/my/java/installation/1.x/bin/java 

Cela montre que /etc/alternatives/java est un autre lien symbolique. Lorsque vous effectuez une update-alternatives sur Java, il vous suffit de remplacer cette cible par un lien symbolique.

Alors, pourquoi la version exécutée ne change-t-elle pas lorsque vous exécutez la commande update-alternatives ? Je suppose que c’est à cause de l’ordre dans lequel les exécutables se trouvent dans $PATH . Comme vous avez ajouté un répertoire à la variable d’environnement PATH, il existe maintenant deux exécutables Java possibles: un dans /usr/bin et l’autre dans /opt/jdk1.8.0_9 , mais seul le premier trouvé sera pris en compte lorsque vous Tapez les commandes java .

Et parce que vous définissez

 PATH=$JAVA_HOME/bin:$PATH 

Le premier sera trouvé dans $JAVA_HOME/bin aka /opt/jdk1.8.0_91 . Parce que vous avez fait apparaître /opt/jdk1.8.0_9 avant /usr/bin défini par défaut dans la variable PATH. Vous pouvez le vérifier en tapant dans un terminal

 $echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/path/to/my/java/installation/1.x/bin 

Vous pouvez voir que mon répertoire java / bin est situé après les autres définis dans PATH.

Pour corriger cela, il suffit de concaténer $JAVA_HOME/bin après $PATH , comme ceci:

 PATH=$PATH:$JAVA_HOME/bin 

De cette façon, vous serez en mesure de choisir l’exécutable Java par défaut parmi les alternatives et l’exécutable Java trouvé dans $JAVA_HOME/bin sera supprimé. Mais pour être cohérent, dans la plupart des cas, vous devriez choisir le même fichier Java comme dans $JAVA_HOME/bin .