Existe uma maneira de atualizar todas as alternativas relacionadas ao Java?

52

Existe uma maneira de alternar rapidamente todas as alternativas relacionadas ao Java usando update-alternatives?

Por exemplo, se você deseja alternar o Java para 7, eu corro sudo update-alternatives --config javae seleciono o Java 7 OpenJdk. Mas se eu correr update-alternatives --get-selections | grep java, recebo o seguinte,

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 você pode ver, minha alternativa Java foi trocada para 7, mas todas as outras alternativas baseadas no OpenJDK 6 não foram trocadas. Claro que eu poderia alternar cada um manualmente ou escrever um script para fazê-lo, mas presumo que haja uma maneira melhor de fazer isso.

James McMahon
fonte

Respostas:

70

O truque é usar update-java-alternatives(do java-commonpacote).

Então, para ir ao OpenJDK 6 a 7, eu costumava update-java-alternatives -lobter uma lista de alternativas Java e depois sudo update-java-alternatives -s java-1.7.0-openjdk-amd64o JDK.

NOTA: O comando acima gerou os seguintes erros,

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

Isso ocorre porque o plug-in openjdk não está instalado por padrão. Para corrigir a execução

sudo apt-get install icedtea-7-plugin

e execute novamente update-java-alternatives.

James McMahon
fonte
8
Você não precisa instalar o plug-in (e não deve, se não precisar, devido a considerações de segurança). update-java-alternativesaltera todas as outras alternativas java, mesmo quando a configuração do plug-in gera um erro.
Daniel kullmann
O que há com a JVM da Oracles? Como posso usar isso? E os executáveis ​​específicos do JDK?
213 keiki
2
Correndo update-java-alternatives --set java-1.8.0-openjdk-amd64eu ainda tenho default-java -> /usr/lib/jvm/java-7-oracle. Isso é causado pelo no alternatives for mozilla-javaplugin.soerro? Como posso mudar isso também?
lony
3

O jbro fez a mesma pergunta em http://ubuntuforums.org/showthread.php?t=1817528 e escreveu um script para esse 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 não houver uma resposta melhor, isso parece uma solução sólida, mas suponho que deve haver uma maneira melhor update-alternativesde lidar com isso.

Editei um pouco o código, pois ele não permite que você faça as alterações antes de instalá-las. Eu adicionei mais duas linhas da seguinte forma ...

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

Para Oracle JVM, execute o seguinte:

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

O <TL; DR> update-java-alternative usa o arquivo .jinfo para determinar quais alternativas alternar, mas também espera que elas tenham sido configuradas separadamente.

Crie um novo arquivo .jinfo e entradas de atualização alternativa se o JRE / JDK baixado não alternar com o update-java-alternative

[Detalhes]

Para configurá-lo manualmente:

  1. Descompacte seu novo jdk ao lado do jdk existente no /usr/lib/jvm/

  2. Gere um arquivo .jdkname.jinfo duplicando outro arquivo .jinfo na pasta (ou pegue um de outra instalação do Ubuntu: você está atrás do modelo tanto quanto qualquer outra coisa).

    O nome do arquivo. jdkname .jinfo deve corresponder ao nome da pasta do jdk.

    Modifique o conteúdo para definir o cabeçalho (nomes) e os caminhos do arquivo (entradas do programa) para corresponder à sua nova instalação.

    Remova todas as linhas referentes aos programas omitidos na sua versão e adicione linhas para novos programas em /bin

  3. Gere alternativas para todos os programas agora no seu pacote .jinfo com este modelo:

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

    (Várias respostas relacionadas o escreveram no conteúdo de / bin ou você pode executar a pesquisa / substituição de regexp no arquivo .jinfo para gerar os comandos de script.)

    Observe que 100 é apenas a prioridade considerada ao definir a versão do jdk usando o sinalizador automático.

  4. Verifique as alternativas java e alterne para usar o JDK.

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

    Observe que alguns JDKs não incluem o JRE, portanto, adicione-o ou remova essas entradas do jinfo.

simon coleman
fonte