Проблема с версиями Java в WSL2 – как будто попадаешь в лабиринт: IDE работает идеально, а терминал упорно выбирает не ту сборку. Особенно досадно, когда Gradle-задачи падают с ошибками из-за конфликта JDK. Давайте разбираться, почему система «не видит» правильный путь и как заставить её играть по вашим правилам.
Почему WSL2 путает версии Java?
Всё начинается с того, что WSL2 – это гибридная среда. Когда вы вызываете java в терминале, система ищет исполняемый файл по цепочке:
- Встроенные пакеты Ubuntu (часто OpenJDK 11)
- Кастомные установки в /opt/
- 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.