Как сменить Java JDK на macOS: 5 ошибок новичков и их решение

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Как сменить версию Java (JDK) на macOS без головной боли: гид для тех, кто устал от ошибок

Вы когда-нибудь пытались запустить старый проект на Java, а он упорно вылетал с ошибкой? Или, наоборот, новая IDE требует JDK 17, а у вас стоит JDK 8? Если вы работаете на macOS, то наверняка сталкивались с тем, что переключение версии Java — это целый квест. Кажется, что команда java -version живёт своей жизнью и не подчиняется вашим желаниям.

На Stack Overflow вопрос «How to set or change the default Java (JDK) version on macOS?» собрал тысячи просмотров и сотни комментариев. Люди путаются в путях, забывают про JAVA_HOME и случайно ломают систему. Давайте разберёмся раз и навсегда: как управлять JDK на Mac, какие ошибки подстерегают новичков и как их обойти.

Эта статья — не сухая документация. Мы пройдём путь от полного хаоса до чёткого понимания. Поехали!

Почему macOS так «странно» работает с Java?

Первое, что нужно понять: macOS — это Unix-система, и она не любит, когда вы вручную пихаете файлы в папки, где им не место. Apple по умолчанию устанавливает JDK в /Library/Java/JavaVirtualMachines/, а системные утилиты вроде /usr/bin/java — это лишь обёртки, которые смотрят на ваш JAVA_HOME.

Самая частая ошибка — попытка переименовать или удалить папку JDK. Не делайте этого! Вместо этого нужно научиться управлять символическими ссылками и переменными окружения.

Шаг 1: Узнаём, какие JDK у вас уже установлены

Прежде чем что-то менять, давайте посмотрим, чем вы располагаете. Откройте Терминал и выполните:

/usr/libexec/java_home -V

Вы увидите что-то вроде:

Matching Java Virtual Machines (3):
    17.0.6 (x86_64) "Oracle Corporation" - "Java SE 17.0.6" /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
    11.0.18 (x86_64) "Oracle Corporation" - "Java SE 11.0.18" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
    1.8.0_361 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_361.jdk/Contents/Home

Это — полный список JDK, которые знает система. Если вы установили JDK через Homebrew или вручную, но он не отображается — значит, он лежит не в той папке или не имеет правильной структуры.

Ошибка №1: Думать, что export JAVA_HOME — это навсегда

Новички часто пишут в терминале:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
java -version  # показывает 17

И радуются. Но стоит закрыть терминал и открыть новый — всё возвращается к старой версии. Почему? Потому что export работает только в текущей сессии.

Решение: Добавьте эту строку в ваш файл конфигурации оболочки. Если вы используете zsh (стандартная оболочка на macOS с Catalina и новее), отредактируйте файл ~/.zshrc:

echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 17)' >> ~/.zshrc
source ~/.zshrc

Если у вас bash (старые версии macOS), то файл называется ~/.bash_profile.

Ошибка №2: Путаница между java и javac

Вы сменили JAVA_HOME, команда java -version показывает нужную версию, но javac -version упорно показывает старую. Знакомо?

Это происходит, потому что java и javac — это разные исполняемые файлы. Иногда они могут быть из разных JDK. Проверьте, где они находятся:

which java   # /usr/bin/java
which javac  # /usr/bin/javac

Если пути одинаковые — проблема в том, что /usr/bin/java — это символическая ссылка, которая может указывать на старую версию. Обновите её с помощью утилиты java_home:

sudo ln -sfn $(/usr/libexec/java_home -v 17)/bin/java /usr/bin/java
sudo ln -sfn $(/usr/libexec/java_home -v 17)/bin/javac /usr/bin/javac

Но будьте осторожны: прямое редактирование /usr/bin может быть перезаписано при обновлении macOS. Лучше использовать jenv (о нём ниже).

Шаг 2: Автоматизация с помощью jenv (рекомендуемый способ)

Если вы часто переключаетесь между версиями Java для разных проектов, ручное редактирование .zshrc — это путь к безумию. Используйте jenv — менеджер версий Java, как nvm для Node.js.

Установка:

brew install jenv

Добавьте jenv в ваш shell:

echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc
source ~/.zshrc

Теперь добавьте все ваши JDK:

jenv add /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home

Посмотреть список:

jenv versions

Установить версию глобально:

jenv global 17

Или для конкретной папки:

cd /path/to/your/project
jenv local 11

Теперь при входе в папку проекта JAVA_HOME автоматически переключается на нужную версию. Это магия, которая спасёт вас от многих головных болей.

Ошибка №3: Забыть про JAVA_HOME в IDE

Вы настроили всё в терминале, но IntelliJ IDEA или Eclipse всё равно используют не ту версию. Почему? Потому что IDE имеют собственные настройки JDK.

Решение: