Изменение версии java в Ubuntu
Рассматриваемая система — Ubuntu 22.04. Нужно сделать так, чтобы была возможность одной командой изменить дефолтную версию java.
На самом деле оно уже есть, и чтобы изменить версию java в ubuntu, нужно лишь использовать команду:
sudo update-alternatives --config java
Эта команда изменит ссылку файла /usr/bin/java, которая ссылается на одну из установленных версий java (обычно в директории /usr/lib/jvm). Также переменная JAVA_HOME, которая по-умолчанию ссылается на /usr/bin/java, попадёт в выбранную версию.
Всё работало до того момента, когда мне понадобилось добавить GraalVm.
Во-первых, GraalVm не появляется в списке update-alternatives;
Во-вторых, даже если его туда добавить, то например, Intellij Idea при попытке компилляции проекта выдает ошибку: ‘gu’ tool was not found in your JAVA_HOME.This probably means that the JDK at ‘/usr/bin/java’ is not a GraalVM distribution.
Проблема с граалем заключается в том, что Idea пытается найти другие бинарные файлы грааля в одной директории с файлом java из $JAVA_HOME, но их ведь нету в /usr/bin.
Проблема решается тем, чтобы удалить конфигурацию java из утилиты update-alternatives и сделать её по-новой, но теперь вместо того, чтобы управлять ссылкой на один только файл java, мы будем управлять ссылкой на всю директорию с джавой. Затем нужно переопределить переменную JAVA_HOME и добавить запись в переменную PATH для доступности команды java. Вот нужные для этого команды:
стандартное изменение версии java:
sudo update-alternatives --config java
Удаление конфигурации для java (перед удалением запомните где там находятся директории с вашей джавой, чтобы их потом использовать)
sudo update-alternatives --remove-all java
Настройка update-alternatives для манипуляции целыми директориями (заметьте, что в конце директорий уже нет /bin/java):
sudo update-alternatives --install /usr/bin/javahome java /usr/lib/jvm/java-17-openjdk-amd64 1
sudo update-alternatives --install /usr/bin/javahome java /usr/lib/jvm/graalvm-jdk-17.0.9+11.1 2
sudo update-alternatives --install /usr/bin/javahome java /usr/lib/jvm/java-11-openjdk-amd64 3
sudo update-alternatives --install /usr/bin/javahome java /usr/lib/jvm/java-17-openjdk-amd64 4
Показать значение переменной JAVA_HOME:
echo $JAVA_HOME
редактировать environment variables:
sudo nano /etc/environment
изменяем значение переменной на:
JAVA_HOME=»/usr/bin/javahome»
добавляем к переменной PATH подстроку:
:/usr/bin/javahome/bin
перечитать environment variables:
source /etc/environment
Теперь можете протестировать переключение java:
sudo update-alternatives --config java
$JAVA_HOME -version
при этом будет изменяться целиком содержимое директории /usr/bin/javahome
UPD: Intellij Idea почему-то не замечает изменения переменной JAVA_HOME и у меня срабатывает только после логаута юзера из системы