web-dev-qa-db-fra.com

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

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

Par exemple, si vous voulez basculer Java sur 7, je lance Sudo update-alternatives --config Java et sélectionnez le Java 7 OpenJdk. Mais si je lance update-alternatives --get-selections | grep Java j'obtiens 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.

51
James McMahon

L'astuce consiste à utiliser update-Java-alternatives (à partir du paquetage Java-common).

Donc, pour OpenJDK 6 à 7, j’ai utilisé update-Java-alternatives -l afin d’obtenir une liste de Java alternatives, puis j’ai utilisé Sudo update-Java-alternatives -s Java-1.7.0-openjdk-AMD64 dans le 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.

70
James McMahon

jbro a posé la même question à l'adresse 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 pour update-alternatives de 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
3
James McMahon

Pour Oracle JVM, lancez ceci:

Sudo update-Java-alternatives -s Java-7-Oracle
1
SteveQian

<TL; DR> pdate-Java-alternatives utilise le fichier .jinfo pour déterminer les alternatives à utiliser, mais attend également qu'ils aient été configurés séparément.

Créez un nouveau fichier .jinfo et des entrées update-alterntive 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-le à partir d'une autre installation Ubuntu: vous recherchez le modèle autant que tout le reste).

    Le nom du 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, aussi ajoutez-le ou supprimez ces entrées jinfo.

0
simon coleman