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
.