Есть ли способ обновить все связанные с Java альтернативы?

52

Есть ли способ быстро переключаться между всеми альтернативами, связанными с Java, используя update-alternatives?

Например, если вы хотите переключить Java на 7, я запускаю sudo update-alternatives --config javaи выбираю Java 7 OpenJdk. Но если я бегу, update-alternatives --get-selections | grep javaя получаю следующее,

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

Как видите, моя альтернатива Java была переключена на 7, но любая другая альтернатива, основанная на OpenJDK 6, не была переключена. Конечно, я мог бы переключать каждый из них вручную или написать скрипт для этого, но я предполагаю, что есть лучший способ сделать это.

Джеймс МакМэхон
источник

Ответы:

70

Хитрость заключается в использовании update-java-alternatives(из java-commonпакета).

Итак, чтобы перейти к OpenJDK 6-7, я использовал update-java-alternatives -lсписок альтернатив Java, а затем использовал его sudo update-java-alternatives -s java-1.7.0-openjdk-amd64для JDK.

ПРИМЕЧАНИЕ. Приведенная выше команда вызвала следующие ошибки:

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

Это потому, что плагин openjdk не установлен по умолчанию. Чтобы исправить запустить

sudo apt-get install icedtea-7-plugin

и перезапустить update-java-alternatives.

Джеймс МакМэхон
источник
8
Вам не нужно устанавливать плагин (и не стоит, если он вам не нужен, из соображений безопасности). update-java-alternativesизменяет все другие альтернативы Java, даже если настройка плагина выдает ошибку.
Даниэль Куллманн
Что с оракулами JVM? Как я могу это использовать? И JDK конкретные исполняемые файлы?
keiki
2
Бег у update-java-alternatives --set java-1.8.0-openjdk-amd64меня еще есть default-java -> /usr/lib/jvm/java-7-oracle. Это вызвано no alternatives for mozilla-javaplugin.soошибкой? Как я могу это изменить?
одинокий
3

jbro задал тот же вопрос на http://ubuntuforums.org/showthread.php?t=1817528 и написал сценарий для этой проблемы,

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

Если нет лучшего ответа, это выглядит как надежный обходной путь, но я полагаю, что должен быть лучший способ update-alternativesсправиться с этим.

Я немного отредактировал код, так как он не позволяет вносить изменения перед их установкой. Я добавил еще две строки следующим образом ...

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

Для Oracle JVM запустите это:

sudo update-java-alternatives -s java-7-oracle
SteveQian
источник
1

<TL; DR> update-java-alternatives использует файл .jinfo, чтобы определить, какие альтернативы переключаться, но также ожидает, что они были настроены отдельно.

Создайте новый файл .jinfo и записи с альтернативой обновления, если загруженный JRE / JDK не переключается с альтернативами update-java

[Подробности]

Чтобы настроить его вручную:

  1. Распакуйте новый JDK вместе с существующим JDK в /usr/lib/jvm/

  2. Создайте файл .jdkname.jinfo , продублировав другой файл .jinfo в папке (или захватите его из другой установки Ubuntu: вам нужен шаблон так же, как и все остальное).

    Имя файла jdkname .jinfo должно совпадать с именем jdk foldername.

    Измените содержимое, чтобы задать заголовок (имена) и пути к файлам (записи программы) в соответствии с вашей новой установкой.

    Удалите все строки, относящиеся к программам, опущенным в вашей версии, и добавьте строки для новых программ в /bin

  3. Создайте альтернативы для всех программ, которые теперь есть в вашем пакете .jinfo, с помощью этого шаблона:

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

    (Несколько связанных ответов написали это из содержимого / bin, или вы можете выполнить поиск / замену регулярного выражения в вашем файле .jinfo для генерации команд сценария.)

    Обратите внимание, что 100 - это просто приоритет, который учитывается при установке версии jdk с использованием флага auto.

  4. Проверьте альтернативы Java и переключитесь на использование JDK.

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

    Обратите внимание, что некоторые JDK не содержат JRE, поэтому либо добавьте его, либо удалите эти записи jinfo.

Саймон Коулман
источник