Как установить и переключать версию Java (JDK) на macOS?
Понимание проблемы: как macOS управляет Java
На macOS версия Java по умолчанию определяется двумя механизмами:
- Системная утилита
/usr/libexec/java_home— она возвращает путь к JDK, который считается "основным". - Переменная окружения
JAVA_HOME— её значение переопределяет системный выбор, но только для текущей сессии терминала.
Если вы просто выполняете export JAVA_HOME=/path/to/jdk17 вручную, это работает только пока открыт терминал. Чтобы сделать изменение постоянным, нужно прописать команду в файл конфигурации оболочки (например, ~/.zshrc для Zsh, который используется в macOS по умолчанию с Catalina и новее).
Шаг 1: Проверяем установленные JDK
/usr/libexec/java_home -V
Эта команда покажет все установленные JDK. Пример вывода:
Matching Java Virtual Machines (3):
21.0.1 (arm64) "Oracle Corporation" - "Java SE 21.0.1" /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
17.0.9 (arm64) "Oracle Corporation" - "Java SE 17.0.9" /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
11.0.18 (arm64) "Oracle Corporation" - "Java SE 11.0.18" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
Запомните путь к нужной версии (например, /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home).
Шаг 2: Настраиваем глобальный JAVA_HOME
Откройте файл конфигурации вашей оболочки:
nano ~/.zshrc
Добавьте в конец файла следующие строки:
# Устанавливаем версию Java по умолчанию (17)
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
export PATH=$JAVA_HOME/bin:$PATH
Объяснение:
/usr/libexec/java_home -v 17— автоматически находит путь к JDK 17.export JAVA_HOME=...— делает переменную доступной для всех программ.export PATH=...— добавляет каталог с java/javac в начало PATH, чтобы они вызывались первыми.
Шаг 3: Применяем изменения
source ~/.zshrc
Теперь проверьте:
java -version
# Должно показать: openjdk version "17.0.9" 2023-10-17 LTS
Шаг 4: Переключение между версиями (продвинутый способ)
Если вам нужно часто переключаться, добавьте в ~/.zshrc функцию:
# Функция для смены Java
set-java() {
export JAVA_HOME=$(/usr/libexec/java_home -v $1)
export PATH=$JAVA_HOME/bin:$PATH
echo "Java $1 activated: $JAVA_HOME"
}
Теперь в терминале можно писать:
set-java 17 # переключиться на Java 17
set-java 21 # переключиться на Java 21
set-java 11 # вернуться на Java 11
Что делать, если не помогло?
- Проверьте, какой файл конфигурации используется:
echo $SHELL— если показывает/bin/zsh, редактируем~/.zshrc. Если/bin/bash—~/.bash_profile. - Убедитесь, что нет конфликтующих настроек: проверьте файлы
~/.bashrc,~/.profile— там может быть старый export JAVA_HOME. - Homebrew: если JDK установлены через
brew install openjdk@17, пути могут быть в/usr/local/opt/openjdk@17— используйте их вexport JAVA_HOMEнапрямую.
После всех настроек перезапустите терминал или выполните source ~/.zshrc. Изменения станут постоянными.
Альтернативный подход: использование jEnv
Если вам неудобно редактировать конфигурационные файлы вручную, установите менеджер версий jEnv. Он работает как аналог nvm для Node.js или rvm для Ruby.
Установка через Homebrew
brew install jenv
После установки добавьте jEnv в оболочку (в ~/.zshrc):
export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"
Перезагрузите терминал и добавьте ваши JDK:
jenv add /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
Использование
Установите глобальную версию:
jenv global 17
Или для конкретного каталога (локально):
cd ~/projects/my-project
jenv local 21
Преимущества
- Автоматически управляет
JAVA_HOMEиPATH. - Позволяет задавать версию Java для каждого проекта отдельно.
- Не требует ручного редактирования
~/.zshrcпосле настройки.
Этот способ особенно удобен, если вы работаете с несколькими проектами, требующими разные версии JDK.