Есть ли способ быстро переключаться между всеми связанными с 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, не была переключена. Конечно, я мог бы переключить каждый из них вручную или написать скрипт для этого, но я предполагаю, что есть лучший способ сделать это.
Хитрость заключается в использовании update-java-альтернативы
(из пакета 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
.
Для Oracle JVM запустите следующее:
sudo update-java-alternatives -s java-7-oracle
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
Если лучшего ответа нет, это кажется надежным решением, но я предполагаю, что должен быть лучший способ для альтернатив обновления
чтобы справиться с этим.
Я немного отредактировал код, так как он не позволяет вам вносить изменения до их установки. Я добавил еще две строки:
#!/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
Создайте новый файл .jinfo и записи для альтернативных обновлений, если загруженный JRE / JDK не переключается с помощью update-java-alternatives
[Подробно]
Чтобы настроить его вручную:
Распакуйте новый jdk вместе с существующим jdk в / usr / lib / jvm /
Создайте .jdkname.jinfo путем дублирования другого файла .jinfo в папке (или возьмите его из другой установки Ubuntu: вы следуете за шаблоном, как и все остальное).
Имя файла. jdkname .jinfo должно соответствовать jdk foldername.
Измените содержимое, чтобы установить заголовок (имена) и пути к файлам (записи программы) в соответствии с вашей новой установкой.
Удалите все строки, относящиеся к программам, опущенным в вашей версии, и добавьте строки для новых программ в / bin
Создайте альтернативы для всех программ в вашем пакете .jinfo с помощью этого шаблона:
sudo update- альтернативы --install / usr / bin / java java / usr / lib / jvm / ** jdkname ** / bin / java 100
(В нескольких связанных ответах это написано из содержимого / bin, или вы можете выполнить поиск / замену регулярного выражения в файле .jinfo для генерации команд сценария.)
Обратите внимание, что 100 - это просто приоритет, который учитывается, когда установка версии jdk с помощью флага auto.
Проверьте альтернативы java и переключитесь на использование JDK.
update-java-alternatives -l
update-java-alternatives -s jdkname
Обратите внимание, что некоторые JDK не включают JRE, поэтому либо добавьте его, либо удалите эти записи jinfo.