Как исправить выбор версии Java в WSL2 для Gradle: подробное руководство

Проблема с версиями Java в WSL2 – как будто попадаешь в лабиринт: IDE работает идеально, а терминал упорно выбирает не ту сборку. Особенно досадно, когда Gradle-задачи падают с ошибками из-за конфликта JDK. Давайте разбираться, почему система «не видит» правильный путь и как заставить её играть по вашим правилам.

Почему WSL2 путает версии Java?

Всё начинается с того, что WSL2 – это гибридная среда. Когда вы вызываете java в терминале, система ищет исполняемый файл по цепочке:

  1. Встроенные пакеты Ubuntu (часто OpenJDK 11)
  2. Кастомные установки в /opt/
  3. Windows-версии через /mnt/c/

В вашем случае which java.exe показал Windows-версию, но реально используемая (через java –version) оказалась OpenJDK 11 из пакетов Ubuntu. При этом JAVA_HOME и PATH настроены на Temurin 17 – казалось бы, парадокс!

Секрет в симлинках: по умолчанию /usr/bin/java ссылается на /etc/alternatives/java, а тот – на конкретную версию JDK. Даже при правильных переменных окружения система может игнорировать их, если символическая ссылка ведёт не туда.

Пошаговое решение: перенаправляем Gradle на нужную Java

1. Ломаем старые связи: Удаляем проблемный симлинк (не волнуйтесь, это обратимо):

sudo rm /usr/bin/java

Если появится ошибка «No such file or directory», проверьте путь через ls -l /usr/bin/java.

2. Создаём новую ссылку: Привязываем системную команду к вашему Temurin 17:

sudo ln -s /opt/java/temurin-17/bin/java /usr/bin/java

Проверяем результат:

ls -l /usr/bin/java | grep temurin

Должна появиться строка вида … -> /opt/java/temurin-17/bin/java

3. Проверяем альтернативы (на всякий случай): Хотя проблема уже решена, загляните в:

sudo update-alternatives –config java

Если в списке нет Temurin 17, добавьте его вручную:

sudo update-alternatives –install /usr/bin/java java /opt/java/temurin-17/bin/java 1000

(Обратите внимание на опечатку в «temurin» – иногда такие мелочи съедают часы отладки!)

Когда решение не помогает: частые ошибки

  • Gradle всё равно использует старую версию – проверьте настройки в ~/.gradle/gradle.properties и локальные gradle-wrapper.properties
  • «Permission denied» при создании симлинка – возможно, забыли sudo или WSL2 не имеет прав на запись в /usr/bin
  • PATH перезаписывается в скриптах – ищите export PATH в /etc/profile.d/, ~/.bash_profile, ~/.bashrc
КомандаЧто показывает
which -a javaВсе пути к java в $PATH
readlink -f $(which java)Куда ведёт конечный симлинк
echo $JAVA_HOMEАктивная домашняя директория JDK

Кстати, если не хочется трогать системные симлинки, есть альтернатива – использовать update-java-alternatives (пакет java-common) или обёртки вроде SDKMAN!. Но для срочного фикса «здесь и сейчас» метод с ручной заменой ссылки работает безотказно.

После всех манипуляций перезапустите оболочку (или выполните source ~/.bashrc) и проверьте версии через java –version и gradle –version. Если Gradle продолжает жаловаться на JAVA_COMPILER, попробуйте очистить кеш:

./gradlew cleanBuildCache

И последнее: когда добавляете пути в $PATH, ставьте их перед системными директориями. Например:

export PATH="/opt/java/temurin-17/bin:$PATH" # Обратите внимание на отсутствие двоеточия в начале!

Так система будет сначала смотреть в вашу папку, а уже потом – в стандартные /usr/bin и /mnt/c.

Теперь вы знаете не только как исправить текущую проблему, но и как предотвратить подобные конфликты в будущем. А если вдруг что-то пойдёт не так – симлинки всегда можно вернуть обратно через sudo update-alternatives –config java.

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное