2016-12-09 2 views
0

Ich bin auf Ubuntu und ich habe folgendes in meiner ~/.bashrc-Datei festgelegt:

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

und dann:

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) 

bei Auf den ersten Blick zeigte der Befehl sudo update-alternatives --config java nicht mein manuell installiertes Java, also habe ich es in den Befehl mit sudo update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_91 1 installiert.

Nun wird der Befehl sudo update-alternatives --config java die Liste aller Java-Versionen nach unten fällt so installiert:

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 

Aber das Umschalten zwischen diesen mit der Aufforderung des sudo update-alternatives --config java nicht $JAVA_HOME und dann $java -version nicht beeinträchtigt.

Meine Frage ist, was macht sudo update-alternatives --config java genau nach dem Wechsel zu einer anderen Alternative in Bezug auf die Einstellungen in der $JAVA_HOME$ Variable?

Antwort

2

Es ändert nur einen Symlink, der sich (bei den meisten Distributionen wohl) bei /etc/alternatives/java befindet. Absolut keine Änderung in der Umgebungsvariablen $JAVA_HOME ist gemacht.

Erster Blick auf aus dem der Befehl gefunden wird, die Sie tun können:

$which java 
/usr/bin/java 

Die, die zeigen Befehl /usr/bin/java in meiner Debian-Distribution. Diese Datei ist ein Symlink, der auf /etc/alternatives/java zeigt.

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

Dann folgen Sie den Symlink:

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

Dies zeigt, dass /etc/alternatives/java andere Symlink ist. Wenn Sie eine update-alternatives auf Java machen, ändern Sie einfach dieses Symlink-Ziel zu einem anderen.

Warum ändert sich dann die ausgeführte Version nicht, wenn Sie den Befehl update-alternatives ausführen? Ich denke, es ist wegen der Reihenfolge der ausführbaren Dateien in $PATH gefunden. Da Sie der PATH-Umgebungsvariablen ein Verzeichnis hinzugefügt haben, gibt es jetzt zwei mögliche Java-Executables: eins in /usr/bin und das andere in /opt/jdk1.8.0_9, aber nur das erste gefundene wird berücksichtigt, wenn Sie java Befehle eingeben.

Und weil Sie

PATH=$JAVA_HOME/bin:$PATH 

Das erste Set wird in $JAVA_HOME/bin aka /opt/jdk1.8.0_91 finden. Weil Sie erscheinen vor /usr/bin, die standardmäßig in der PATH-Variable definiert ist. Sie können es, indem sie in einem Terminal eingeben

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

Sie können sehen, dass mein Java/ist dir nach dem anderen in der PATH definiert befindet.

Um dies zu korrigieren, müssen Sie nur noch $JAVA_HOME/bin nach $PATH verketten, wie folgt aus:

PATH=$PATH:$JAVA_HOME/bin 

diese Weise werden Sie in $JAVA_HOME/bin gefunden die Standard-Java-ausführbare Datei von Alternativen und die Java-exe zu wählen Lage sein wird, sein verworfen. Aber um konsistent zu sein, sollten Sie in den meisten Fällen die gleiche Java-Exe wie in $JAVA_HOME/bin wählen.