Java-Version pro Sitzung umschalten

7

Ich habe eine Kombination aus Java7 und Java8 auf meinem 14.04-Computer installiert.

Wenn ich zwischen ihnen wechseln möchte, mache ich eine sudo update-alternatives --config java. Wenn Sie es jedoch auf diese Weise ändern, wird die aktuelle Java-Version auf allen Terminals geändert. Ich wollte es nur für das aktuelle Terminal ändern. Zum Beispiel möchte ich Java-Code, der in 1.7 geschrieben wurde, mit anderem Code testen, der in 1.8 kompiliert wurde.

Eine andere Alternative wäre so etwas zu tun

function java_use() {
   export JAVA_HOME=$(/usr/libexec/java_home -v $1)
   export PATH=$JAVA_HOME/bin:$PATH
   java -version
}

Aber das funktioniert nur auf meinem Mac und ich wollte etwas saubereres, ohne es PATHjedes Mal ändern zu müssen . Vielleicht mit chroot?

Wie kann ich meine Java-Version "sauber" ändern - vorzugsweise nur zwischen den installierten Versionen - und nur für die aktuelle Terminalsitzung?

Alexandre Santos
quelle
Es gibt einen ausgezeichneten Blog- Beitrag , der genau beschreibt, wonach Sie suchen!
Ron

Antworten:

5

Wenn Sie sich das ansehen /usr/sbin/update-java-alternatives, werden Sie sehen, dass es iteriert /usr/lib/jvm/.*.jinfo, um die installierten Versionen zu finden, sodass Sie dasselbe tun können, um die installierten Versionen zu erkennen.

Wenn Sie nicht PATHjedes Mal Änderungen PATHvornehmen möchten , können Sie Bash vollständig umgehen, indem Sie dem eingebauten hashBefehl (run help hash) mitteilen, welche Binärdatei für Java verwendet werden soll .

Hier ist etwas, worauf Sie aufbauen können:

java_use() {
    local file version versions=()
    for file in /usr/lib/jvm/.*.jinfo; do
        [[ -e $file ]] || continue
        version=${file##*/.} version=${version%.jinfo}
        versions+=("$version")
    done
    if (( ${#versions[@]} == 0 )); then
        printf >&2 'No java installed\n'
        return 1
    fi
    select version in "${versions[@]}"; do
        if [[ -n $version ]]; then
            export JAVA_HOME="/usr/lib/jvm/$version"
            hash -p "$JAVA_HOME/bin/java" java
            break
        fi
    done
    type java
}
Geirha
quelle
genial. Was wäre die Kirsche an der Spitze: Wenn sie zeigen würde, welche der Versionen derzeit verwendet wird (genauso wie dies der --config javaFall ist), aber so wie sie ist, verdient sie die Antwort.
Alexandre Santos
@AlexandreSantos, Sie könnten so etwas wie printf 'Currently using: '; type -P javaam Anfang der Funktion setzen
Geirha
Dies ist eine der besten und nützlichsten Antworten, die ich bei Stack Overflow gesehen habe. Tolle Hilfe, vielen Dank!
Per Lundberg