Czy istnieje sposób na zaktualizowanie wszystkich alternatyw związanych z Javą?

51

Czy istnieje sposób na szybkie przełączenie wszystkich alternatyw związanych z Javą update-alternatives?

Na przykład, jeśli chcę przełączyć Java na 7, uruchamiam sudo update-alternatives --config javai wybieram Java 7 OpenJdk. Ale jeśli uruchomię update-alternatives --get-selections | grep java, otrzymam następujące informacje,

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

Jak widać, moja alternatywa Java została przełączona na 7, ale każda inna alternatywa oparta na OpenJDK 6 nie została przełączona. Pewnie, że mogę zmienić każdy z nich ręcznie lub napisać skrypt, aby to zrobić, ale zakładam, że jest lepszy sposób na osiągnięcie tego.

James McMahon
źródło

Odpowiedzi:

70

Sztuką jest użycie update-java-alternatives(z java-commonpakietu).

Więc jeśli chodzi o OpenJDK 6 do 7, uzywałem update-java-alternatives -llisty alternatyw dla Javy, a potem korzystałem sudo update-java-alternatives -s java-1.7.0-openjdk-amd64z JDK.

UWAGA: powyższe polecenie spowodowało następujące błędy,

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

Wynika to z faktu, że wtyczka openjdk nie jest instalowana domyślnie. Naprawić bieg

sudo apt-get install icedtea-7-plugin

i uruchom ponownie update-java-alternatives.

James McMahon
źródło
8
Nie musisz instalować wtyczki (i nie powinieneś, jeśli nie potrzebujesz, ze względów bezpieczeństwa). update-java-alternativeszmienia wszystkie inne alternatywy Java, nawet jeśli ustawienie wtyczki powoduje błąd.
Daniel Kullmann
Co jest z JVM firmy Oracles? Jak mogę tego użyć? A pliki wykonywalne specyficzne dla JDK?
keiki
2
Uruchamianie update-java-alternatives --set java-1.8.0-openjdk-amd64nadal mam default-java -> /usr/lib/jvm/java-7-oracle. Czy jest to spowodowane no alternatives for mozilla-javaplugin.sobłędem? Jak mogę to również zmienić?
lony
3

jbro zadał to samo pytanie na http://ubuntuforums.org/showthread.php?t=1817528 i napisał skrypt dla tego problemu,

#!/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

Jeśli nie ma lepszej odpowiedzi, wydaje się to solidnym obejściem, ale zakładam, że musi istnieć lepszy sposób, update-alternativesaby sobie z tym poradzić.

Zmodyfikowałem trochę kod, ponieważ nie pozwala on na wprowadzanie zmian przed ich instalacją. Dodałem dwie kolejne linie w następujący sposób ...

#!/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
źródło
1

W przypadku Oracle JVM uruchom to:

sudo update-java-alternatives -s java-7-oracle
SteveQian
źródło
0

<TL; DR> update-java-alternatives używa pliku .jinfo do ustalenia, które alternatywy się przełączają, ale oczekuje również, że zostaną skonfigurowane osobno.

Utwórz nowy plik .jinfo i wpisy modyfikujące aktualizację, jeśli pobrany JRE / JDK nie przełącza się z aktualizacją-java-alternatives

[Detale]

Aby skonfigurować go ręcznie:

  1. Rozpakuj nowy jdk obok istniejącego jdk w /usr/lib/jvm/

  2. Wygeneruj plik .jdkname.jinfo , duplikując inny plik .jinfo w folderze (lub pobierz jeden z innej instalacji Ubuntu: jesteś za szablonem tak samo, jak cokolwiek innego).

    Nazwa pliku Plik jdkname .jinfo musi być zgodny z nazwą folderu jdk.

    Zmodyfikuj zawartość, aby ustawić nagłówek (nazwy) i ścieżki do plików (wpisy programu) w celu dopasowania do nowej instalacji.

    Usuń wszystkie wiersze odnoszące się do programów pominiętych w twojej wersji i dodaj wiersze dla nowych programów w /bin

  3. Wygeneruj alternatywy dla wszystkich programów teraz w pakiecie .jinfo za pomocą tego szablonu:

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

    (Kilka powiązanych odpowiedzi zapisało to w skrypcie z zawartości pliku / bin lub możesz przeprowadzić wyszukiwanie / wyrażenie regularne w pliku .jinfo, aby wygenerować polecenia skryptu).

    Zauważ, że 100 jest tylko priorytetem branym pod uwagę przy ustawianiu wersji jdk za pomocą flagi auto.

  4. Sprawdź alternatywy java i przełącz się na używanie JDK.

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

    Zauważ, że niektóre JDK nie zawierają środowiska JRE, więc dodaj go lub usuń wpisy jinfo.

Simon Coleman
źródło