Как сменить версию 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.
Решение:
- В IntelliJ IDEA: File → Project Structure → SDK → Add JDK и укажите путь
/Library/Java/JavaVirtualMachines/... - В Eclipse:
Блоги
Рекомендаций по книгам
Читайте также
Kotlin для машинного обучения: возможности и ограничения на практике
Git workflow для Swift разработчиков: от коммита до релиза без боли
TypeScript на GitHub: 7 репозиториев, которые прокачают ваш код
Монорепозиторий с TypeScript: организация кода на практике
Как go test запускает все тесты проекта: разбор под капотом