Gibt es eine Möglichkeit, alle Java-bezogenen Alternativen zu aktualisieren?

51

Gibt es eine Möglichkeit, alle Java-bezogenen Alternativen mit schnell umzuschalten update-alternatives?

Wenn Sie beispielsweise Java auf 7 umstellen möchten, führen sudo update-alternatives --config javaSie Java 7 OpenJdk aus und wählen Sie es aus. Aber wenn ich renne, update-alternatives --get-selections | grep javabekomme ich Folgendes:

appletviewer                   auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/appletviewer
extcheck                       auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/extcheck
idlj                           auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/idlj
itweb-settings                 auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/itweb-settings
jar                            auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jar
jarsigner                      auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jarsigner
java                           manual   /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
javac                          auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/javac
javadoc                        auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/javadoc
javah                          auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/javah
javap                          auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/javap
javaws                         auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/javaws
jconsole                       auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jconsole
jdb                            auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jdb
jexec                          auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/jexec
jhat                           auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jhat
jinfo                          auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jinfo
jmap                           auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jmap
jps                            auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jps
jrunscript                     auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jrunscript
jsadebugd                      auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jsadebugd
jstack                         auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jstack
jstat                          auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jstat
jstatd                         auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jstatd
keytool                        auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/keytool
native2ascii                   auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/native2ascii
orbd                           auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/orbd
pack200                        auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/pack200
policytool                     auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/policytool
rmic                           auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/rmic
rmid                           auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/rmid
rmiregistry                    auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/rmiregistry
schemagen                      auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/schemagen
serialver                      auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/serialver
servertool                     auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/servertool
tnameserv                      auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/tnameserv
unpack200                      auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/unpack200
wsgen                          auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/wsgen
wsimport                       auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/wsimport
xjc                            auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/xjc

Wie Sie sehen, wurde meine Java-Alternative auf 7 umgestellt, aber jede andere auf OpenJDK 6 basierende Alternative wurde nicht umgestellt. Natürlich könnte ich jede manuell wechseln oder ein Skript schreiben, aber ich gehe davon aus, dass es einen besseren Weg gibt, dies zu erreichen.

James McMahon
quelle

Antworten:

70

Der Trick ist zu verwenden update-java-alternatives(aus dem java-commonPaket).

Für OpenJDK 6 bis 7 habe ich mir update-java-alternatives -leine Liste mit Java-Alternativen besorgt und mich dann sudo update-java-alternatives -s java-1.7.0-openjdk-amd64an das JDK gewöhnt.

HINWEIS: Der obige Befehl hat die folgenden Fehler verursacht:

update-alternatives: error: no alternatives for mozilla-javaplugin.so.
update-java-alternatives: plugin alternative does not exist: /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/IcedTeaPlugin.so

Dies liegt daran, dass das openjdk-Plugin nicht standardmäßig installiert ist. Run zu beheben

sudo apt-get install icedtea-7-plugin

und erneut ausführen update-java-alternatives.

James McMahon
quelle
8
Sie müssen das Plugin nicht installieren (und sollten es aus Sicherheitsgründen nicht installieren, wenn Sie es nicht benötigen). update-java-alternativesÄndert alle anderen Java-Alternativen, auch wenn die Plugin-Einstellung einen Fehler auslöst.
Daniel Kullmann
Was ist mit Oracles JVM? Wie kann ich das nutzen? Und die JDK-spezifischen ausführbaren Dateien?
Keiki
2
Laufen habe update-java-alternatives --set java-1.8.0-openjdk-amd64ich noch default-java -> /usr/lib/jvm/java-7-oracle. Liegt das am no alternatives for mozilla-javaplugin.soFehler? Wie kann ich das auch ändern?
Lony
3

jbro stellte dieselbe Frage unter http://ubuntuforums.org/showthread.php?t=1817528 und schrieb ein Skript für dieses Problem.

#!/bin/bash

update-alternatives --get-selections | grep -i openjdk |
while read line
do
    alternative=$(echo $line | awk '{print $1}')
    path=$(echo $line | awk '{print $3}')
    newpath=$(echo $path | sed -e 's/java-6-openjdk/java-6-sun/')
    status=unchanged
    if [ -f $newpath ]
    then
    status=modified
    echo "-> update-alternatives --set $alternative $newpath"
    update-alternatives --set $alternative $newpath
    else
    echo "$alternative unchanged"
    fi
done

Wenn es keine bessere Antwort gibt, scheint dies eine solide Lösung zu sein, aber ich gehe davon aus, dass es eine bessere Möglichkeit geben muss, update-alternativesdamit umzugehen.

Ich habe den Code ein wenig bearbeitet, da Sie die Änderungen vor der Installation nicht vornehmen können. Ich habe zwei weitere Zeilen wie folgt hinzugefügt ...

#!/bin/bash

update-alternatives --get-selections | grep -i openjdk |
while read line
do
    alternative=$(echo $line | awk '{print $1}')
    path=$(echo $line | awk '{print $3}')
    newpath=$(echo $path | sed -e 's/java-6-openjdk/java-6-sun/')
    status=unchanged
    if [ -f $newpath ]
    then
    status=modified
echo "-> update-alternatives --install /usr/bin/$alternative $alternative $newpath 1"
update-alternatives --install /usr/bin/$alternative $alternative $newpath 1
    echo "-> update-alternatives --set $alternative $newpath"
    update-alternatives --set $alternative $newpath
    else
    echo "$alternative unchanged"
    fi
done
James McMahon
quelle
1

Führen Sie für Oracle JVM Folgendes aus:

sudo update-java-alternatives -s java-7-oracle
SteveQian
quelle
0

<TL; DR> update-java-alternatives verwendet die .jinfo-Datei, um zu bestimmen, welche Alternativen umgeschaltet werden sollen, erwartet jedoch auch, dass sie separat konfiguriert wurden.

Erstellen Sie eine neue .jinfo-Datei und aktualisieren Sie alternative Einträge, wenn Ihre heruntergeladene JRE / JDK nicht mit update-java-alternatives umschaltet

[Einzelheiten]

So konfigurieren Sie es manuell:

  1. Dekomprimieren Sie Ihr neues JDK neben dem vorhandenen JDK in /usr/lib/jvm/

  2. Generieren Sie eine .jdkname.jinfo- Datei, indem Sie eine andere .jinfo-Datei im Ordner duplizieren (oder holen Sie sich eine von einer anderen Ubuntu-Installation: Sie sind wie alles andere hinter der Vorlage her).

    Der Dateiname. jdkname .jinfo muss mit dem jdk-Ordnernamen übereinstimmen.

    Ändern Sie den Inhalt, um den Header (Namen) und die Dateipfade (Programmeinträge) entsprechend Ihrer neuen Installation festzulegen.

    Entfernen Sie alle Zeilen, die sich auf Programme beziehen, die in Ihrer Version ausgelassen wurden, und fügen Sie Zeilen für neue Programme hinzu /bin

  3. Generieren Sie mit dieser Vorlage Alternativen für alle Programme, die jetzt in Ihrem .jinfo-Paket enthalten sind:

    sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/**jdkname**/bin/java 100

    (Mehrere verwandte Antworten haben dies aus dem Inhalt von / bin heraus skriptiert, oder Sie können eine reguläre Suche / Ersetzung für Ihre .jinfo-Datei durchführen, um die Skriptbefehle zu generieren.)

    Beachten Sie, dass 100 nur die Priorität ist, die beim Festlegen der JDK-Version mithilfe des Auto-Flags berücksichtigt wird.

  4. Überprüfen Sie die Java-Alternativen und wechseln Sie zur Verwendung des JDK.

    update-java-alternatives -l  
    update-java-alternatives -s jdkname  

    Beachten Sie, dass einige JDKs die JRE nicht enthalten. Fügen Sie sie daher hinzu, oder entfernen Sie diese jinfo-Einträge.

Simon Coleman
quelle