C'è un modo per aggiornare tutte le alternative relative a Java?


52

Esiste un modo per passare rapidamente da una alternativa all'altra utilizzando Java update-alternatives?

Ad esempio, se voglio passare Java su 7, corro sudo update-alternatives --config javae seleziono Java 7 OpenJdk. Ma se corro update-alternatives --get-selections | grep javaottengo il seguente,

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

Come puoi vedere, la mia alternativa a Java è stata commutata su 7, ma ogni altra alternativa basata su OpenJDK 6 non è stata commutata. Certo, potrei cambiare ognuno manualmente o scrivere uno script per farlo, ma suppongo che ci sia un modo migliore per farlo.

Risposte:


70

Il trucco è usare update-java-alternatives(dal java-commonpacchetto).

Quindi, per usare OpenJDK da 6 a 7, ho usato update-java-alternatives -lper ottenere un elenco di alternative Java e poi ho usato sudo update-java-alternatives -s java-1.7.0-openjdk-amd64JDK.

NOTA: il comando sopra ha generato i seguenti errori,

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

Questo perché il plug-in openjdk non è installato per impostazione predefinita. Per correggere la corsa

sudo apt-get install icedtea-7-plugin

e rieseguire update-java-alternatives.


8
Non è necessario installare il plug-in (e non dovresti farlo se non ti serve, per motivi di sicurezza). update-java-alternativescambia tutte le altre alternative java, anche quando l'impostazione del plugin genera un errore.
daniel kullmann,

Che cos'è Oracles JVM? Come posso usarlo? E gli eseguibili specifici di JDK?
keiki

2
Correre update-java-alternatives --set java-1.8.0-openjdk-amd64ancora default-java -> /usr/lib/jvm/java-7-oracle. Questo è causato no alternatives for mozilla-javaplugin.sodall'errore? Come posso cambiare anche questo?
pazzo

3

jbro ha posto la stessa domanda su http://ubuntuforums.org/showthread.php?t=1817528 e ha scritto uno script per questo problema,

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

Se non c'è una risposta migliore, questa sembra una soluzione alternativa, ma suppongo che ci debba essere un modo migliore per update-alternativesgestirlo.

Ho modificato un po 'il codice, poiché non ti consente di apportare le modifiche prima di installarle. Ho aggiunto altre due righe come segue ...

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

1

Per Oracle JVM, esegui questo:

sudo update-java-alternatives -s java-7-oracle

1

<TL; DR> update-java-alternatives utilizza il file .jinfo per determinare quali alternative cambiare, ma si aspetta anche che siano state configurate separatamente.

Crea un nuovo file .jinfo e voci update-alterntive se il tuo JRE / JDK scaricato non passa con update-java-alternatives

[Dettagli]

Per configurarlo manualmente:

  1. Decomprimi il tuo nuovo jdk insieme al jdk esistente in /usr/lib/jvm/

  2. Genera un file .jdkname.jinfo duplicando un altro file .jinfo nella cartella (o prendine uno da un'altra installazione di Ubuntu: stai seguendo il modello tanto quanto qualsiasi altra cosa).

    Il nome del file. jdkname .jinfo deve corrispondere al nome utente jdk.

    Modifica il contenuto per impostare l'intestazione (nomi) e i percorsi dei file (voci del programma) in modo che corrispondano alla nuova installazione.

    Rimuovi tutte le righe che si riferiscono ai programmi omessi nella tua versione e aggiungi le righe per i nuovi programmi in /bin

  3. Genera alternative per tutti i programmi ora nel tuo pacchetto .jinfo con questo modello:

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

    (Diverse risposte correlate lo hanno copiato dal contenuto di / bin oppure è possibile eseguire la ricerca / sostituzione regexp sul file .jinfo per generare i comandi di script.)

    Nota che 100 è solo la priorità che viene considerata quando si imposta la versione jdk usando il flag automatico.

  4. Controlla le alternative java e passa all'uso di JDK.

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

    Nota che alcuni JDK non includono JRE, quindi aggiungilo o rimuovi quelle voci jinfo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.