Existe-t-il un moyen de mettre à jour toutes les alternatives liées à Java?

52

Existe-t-il un moyen de basculer rapidement sur toutes les alternatives liées à Java en utilisant update-alternatives?

Par exemple, si vous souhaitez passer de Java à 7, je lance sudo update-alternatives --config javaet sélectionne Java 7 OpenJdk. Mais si je cours update-alternatives --get-selections | grep javaje reçois ce qui suit,

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

Comme vous pouvez le constater, mon alternative à Java a été basculée sur 7, mais toutes les autres alternatives basées sur OpenJDK 6 n'ont pas été basculées. Bien sûr, je pourrais commuter chacun manuellement ou écrire un script pour le faire, mais je suppose qu’il existe un meilleur moyen de le faire.

James McMahon
la source

Réponses:

70

L'astuce consiste à utiliser update-java-alternatives(à partir du java-commonpackage).

Donc, pour OpenJDK 6 à 7, j'avais l'habitude update-java-alternatives -ld'obtenir une liste d'alternatives Java, puis sudo update-java-alternatives -s java-1.7.0-openjdk-amd64de JDK.

Remarque: la commande ci-dessus a jeté les erreurs suivantes,

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

En effet, le plugin openjdk n'est pas installé par défaut. Pour réparer

sudo apt-get install icedtea-7-plugin

et relancez update-java-alternatives.

James McMahon
la source
8
Vous n'êtes pas obligé d'installer le plugin (et vous ne devriez pas le faire si vous n'en avez pas besoin, pour des raisons de sécurité). update-java-alternativesmodifie toutes les autres alternatives java, même lorsque le paramètre de plug-in génère une erreur.
daniel kullmann
Qu'est-ce qui se passe avec la machine virtuelle Oracles? Comment puis-je l'utiliser? Et les exécutables spécifiques JDK?
keiki
2
Courir update-java-alternatives --set java-1.8.0-openjdk-amd64j'ai encore default-java -> /usr/lib/jvm/java-7-oracle. Est-ce causé par l' no alternatives for mozilla-javaplugin.soerreur? Comment puis-je changer cela aussi?
Lony
3

jbro a posé la même question sur http://ubuntuforums.org/showthread.php?t=1817528 et a écrit un script pour ce numéro,

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

S'il n'y a pas de meilleure réponse, cela semble être une solution de contournement solide, mais je suppose qu'il doit exister un meilleur moyen update-alternativesde gérer cela.

J'ai un peu modifié le code, car il ne vous permet pas de faire les modifications avant de les installer. J'ai ajouté deux autres lignes comme suit ...

#!/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
la source
1

Pour Oracle JVM, lancez ceci:

sudo update-java-alternatives -s java-7-oracle
SteveQian
la source
1

<TL; DR> update-java-alternatives utilise le fichier .jinfo pour déterminer qui des alternatives à travers l' interrupteur , mais attend également d'eux ont été configurés séparément.

Créez un nouveau fichier .jinfo et des entrées update-alternt si votre JRE / JDK téléchargé ne bascule pas avec update-java-alternatives

[Détails]

Pour le configurer manuellement:

  1. Décompressez votre nouveau jdk avec le jdk existant dans /usr/lib/jvm/

  2. Générez un fichier .jdkname.jinfo en dupliquant un autre fichier .jinfo dans le dossier (ou récupérez-en un depuis une autre installation Ubuntu: vous recherchez le modèle autant que tout autre élément).

    Le nom de fichier. jdkname .jinfo doit correspondre au nom de dossier jdk.

    Modifiez le contenu pour que l'en-tête (noms) et les chemins de fichier (entrées de programme) correspondent à votre nouvelle installation.

    Supprimez toutes les lignes faisant référence à des programmes omis dans votre version et ajoutez des lignes pour les nouveaux programmes dans /bin

  3. Générez des alternatives pour tous les programmes maintenant dans votre paquet .jinfo avec ce modèle:

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

    (Plusieurs réponses connexes ont écrit cela à partir du contenu de / bin ou vous pouvez effectuer une recherche / un remplacement d'expression régulière sur votre fichier .jinfo pour générer les commandes de script.)

    Notez que 100 n’est que la priorité prise en compte lors de la définition de la version de jdk à l’aide du drapeau automatique.

  4. Vérifiez les alternatives Java et utilisez le JDK.

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

    Notez que certains JDK n'incluent pas le JRE, ajoutez-le ou supprimez ces entrées jinfo.

Simon Coleman
la source