Чи є спосіб оновити всі пов'язані з Java альтернативи?


51

Чи є спосіб швидко переключитися на всі альтернативи, пов'язані з 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-alternativesjava-commonпакета).

Отже, щоб піти на OpenJDK 6 до 7, я використовував update-java-alternatives -lсписок альтернатив Java, а потім використовував sudo update-java-alternatives -s java-1.7.0-openjdk-amd64JDK.

ПРИМІТКА. Команда, наведена вище, видала наступні помилки,

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, навіть коли налаштування плагіна видає помилку.
daniel kullmann

Що з Oracles 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


0

<TL; DR> update-java-альтернативи використовує файл .jinfo, щоб визначити, які альтернативи переходити, але також очікує, що вони будуть налаштовані окремо.

Створіть новий .jinfo файл та оновлення-alterntive записи, якщо завантажений JRE / JDK не перемикається з оновленнями-java-альтернативами

[Детальніше]

Щоб налаштувати його вручну:

  1. Декомпресуйте новий jdk поряд із існуючим jdk в /usr/lib/jvm/

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

    Ім'я файлу. jdkname .jinfo має відповідати імені папки jdk.

    Змініть вміст, щоб встановити заголовок (імена) та шляхи до файлів (записи програми) відповідно до вашої нової установки.

    Видаліть будь-які рядки, що стосуються програм, пропущених у вашій версії, та додайте рядки для нових програм у /bin

  3. Створіть альтернативи для всіх програм зараз у своєму пакеті .jinfo за допомогою цього шаблону:

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

    (Кілька пов'язаних відповідей написали це з вмісту / bin, або ви можете виконати повторний пошук / заміну у файлі .jinfo для створення команд скрипту.)

    Зверніть увагу, що 100 - це лише пріоритет, який враховується при встановленні версії jdk за допомогою автоматичного прапора.

  4. Перевірте альтернативи java та перейдіть на використання JDK.

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

    Зауважте, що деякі JDK не містять JRE, тому або додайте їх, або видаліть ці записи jinfo.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.