Avatar ·

Как установить и переключать версию Java (JDK) на macOS?

Всем привет! Я начинающий Java-разработчик, работаю на macOS. У меня установлено несколько версий JDK: 11, 17 и 21. Проблема в том, что когда я проверяю версию через терминал, система всегда показывает одну и ту же — 11, хотя мне для проекта нужна 17. Я пробовал менять переменную JAVA_HOME вручную через export, но после перезапуска терминала всё сбрасывается. Ещё я скачал несколько JDK через Homebrew, потом удалил их, и теперь в списке /usr/libexec/java_home -V показывается каша. Подскажите, как правильно настроить окружение, чтобы я мог легко переключаться между версиями? Хочется, чтобы смена была глобальной (для всего терминала) и сохранялась после перезапуска. Вот что сейчас выдаёт команда: ```bash $ java -version openjdk version "11.0.18" 2023-01-17 LTS ``` А мне нужно, чтобы по умолчанию стояла 17. Помогите разобраться, а то уже голову сломал. Заранее спасибо! <<>>

Понимание проблемы: как 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.