¿Hay alguna manera de actualizar todas las alternativas relacionadas con Java?

52

¿Hay alguna manera de cambiar rápidamente todas las alternativas relacionadas con Java usando update-alternatives?

Por ejemplo, si quiero cambiar Java a 7, ejecuto sudo update-alternatives --config javay selecciono Java 7 OpenJdk. Pero si corro update-alternatives --get-selections | grep javame sale lo siguiente,

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

Como puede ver, mi alternativa Java se cambió a 7, pero no se cambió ninguna otra alternativa basada en OpenJDK 6. Claro que podría cambiar cada uno manualmente o escribir un script para hacerlo, pero supongo que hay una mejor manera de lograr esto.

James McMahon
fuente

Respuestas:

70

El truco es usar update-java-alternatives(del java-commonpaquete).

Entonces, para ir a OpenJDK 6 a 7, solía update-java-alternatives -lobtener una lista de alternativas de Java y luego solía usar sudo update-java-alternatives -s java-1.7.0-openjdk-amd64JDK.

NOTA: El comando anterior arrojó los siguientes errores,

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

Esto se debe a que el complemento openjdk no está instalado de manera predeterminada. Para arreglar correr

sudo apt-get install icedtea-7-plugin

y volver a ejecutar update-java-alternatives.

James McMahon
fuente
8
No tiene que instalar el complemento (y no debería hacerlo si no lo necesita, debido a consideraciones de seguridad). update-java-alternativescambia todas las demás alternativas de Java, incluso cuando la configuración del complemento arroja un error.
daniel kullmann
¿Qué pasa con Oracles JVM? ¿Cómo puedo usar eso? ¿Y los ejecutables específicos de JDK?
keiki
2
Correr update-java-alternatives --set java-1.8.0-openjdk-amd64todavía tengo default-java -> /usr/lib/jvm/java-7-oracle. ¿Es esto causado por el no alternatives for mozilla-javaplugin.soerror? ¿Cómo puedo cambiar esto también?
lony
3

jbro hizo la misma pregunta en http://ubuntuforums.org/showthread.php?t=1817528 y escribió un script para este 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

Si no hay una mejor respuesta, esto parece una solución sólida, pero supongo que debe haber una mejor manera de update-alternativesmanejar esto.

Edité un poco el código, ya que no te permite hacer los cambios antes de instalarlos. Agregué dos líneas más de la siguiente manera ...

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

Para Oracle JVM, ejecute esto:

sudo update-java-alternatives -s java-7-oracle
SteveQian
fuente
1

<TL; DR> update-java-alternative utiliza el archivo .jinfo para determinar qué alternativas cambiar, pero también espera que se hayan configurado por separado.

Cree un nuevo archivo .jinfo y actualice las entradas alternativas si su JRE / JDK descargado no cambia con update-java-alternative

[Detalles]

Para configurarlo manualmente:

  1. Descomprima su nuevo jdk junto con el jdk existente en /usr/lib/jvm/

  2. Genere un archivo .jdkname.jinfo duplicando otro archivo .jinfo en la carpeta (o tome uno de otra instalación de Ubuntu: está detrás de la plantilla tanto como cualquier otra cosa).

    El nombre del archivo. jdkname .jinfo debe coincidir con el nombre de la carpeta jdk.

    Modifique el contenido para establecer el encabezado (nombres) y las rutas de los archivos (entradas del programa) para que coincidan con su nueva instalación.

    Elimine las líneas que se refieren a programas omitidos en su versión y agregue líneas para nuevos programas en /bin

  3. Genere alternativas para todos los programas ahora en su paquete .jinfo con esta plantilla:

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

    (Varias respuestas relacionadas han escrito esto desde el contenido de / bin o puede realizar la búsqueda / reemplazo de expresiones regulares en su archivo .jinfo para generar los comandos del script).

    Tenga en cuenta que el 100 es solo la prioridad que se considera al configurar la versión jdk utilizando el indicador automático.

  4. Verifique las alternativas de Java y cambie para usar el JDK.

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

    Tenga en cuenta que algunos JDK no incluyen el JRE, por lo tanto, agréguelo o elimine esas entradas de jinfo.

Simon Coleman
fuente