Avatar ·

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

Всем привет! Я новичок в Java и macOS, перешел недавно с Windows. Установил несколько версий JDK (11, 17 и 21) через Homebrew и официальные установщики. Теперь у меня проблема: когда я открываю терминал и пишу `java -version`, всегда показывается Java 11, хотя для моего проекта в IntelliJ IDEA нужна Java 17. Я пробовал добавлять `export JAVA_HOME=/usr/libexec/java_home -v 17` в файл `~/.zshrc`, но после перезапуска терминала ничего не меняется. Плюс я не понимаю, как проверить, какие версии JDK вообще установлены в системе. Вот пример моего кода, который не компилируется из-за старой версии: ```java // TestSealed.java — требует Java 17+ public sealed class TestSealed permits ChildClass { public void test() { System.out.println("Sealed class test"); } } final class ChildClass extends TestSealed {} ``` При компиляции через `javac TestSealed.java` получаю ошибку: `sealed classes are not supported in -source 11`. Как мне сделать, чтобы по умолчанию система использовала Java 17? Нужна подробная инструкция для новичка. Спасибо! <<>>

Пошаговое руководство по управлению версиями Java на macOS

Проблема с переключением версий JDK на macOS — одна из самых частых у начинающих разработчиков. macOS использует утилиту /usr/libexec/java_home для управления Java. Давайте разберем правильное решение.

Шаг 1: Проверьте установленные версии JDK

Сначала узнайте, какие версии Java реально установлены:

/usr/libexec/java_home -V

Вы увидите список вроде:

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.21 (arm64) "Oracle Corporation" - "Java SE 11.0.21" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home

Шаг 2: Правильная настройка JAVA_HOME

Откройте файл конфигурации вашей оболочки. Если используете Zsh (стандартная оболочка в macOS с Catalina и новее):

nano ~/.zshrc

Добавьте в конец файла следующие строки:

# Установка Java 17 по умолчанию
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
export PATH=$JAVA_HOME/bin:$PATH

Сохраните файл (Ctrl+O, Enter, Ctrl+X) и примените изменения:

source ~/.zshrc

Шаг 3: Проверьте результат

Теперь проверьте:

java -version

Должно показать Java 17. Если всё ещё видите Java 11 — проверьте, нет ли других настроек в ~/.bash_profile или ~/.profile, которые переопределяют JAVA_HOME.

Шаг 4: Быстрое переключение между версиями (для продвинутых)

Добавьте в ~/.zshrc функцию для быстрого переключения:

function setjdk() {
    if [ $# -ne 1 ]; then
        echo "Usage: setjdk <version>"
        return 1
    fi
    export JAVA_HOME=$(/usr/libexec/java_home -v $1)
    export PATH=$JAVA_HOME/bin:$PATH
    java -version
}

Теперь можно переключаться командой: setjdk 21

Проверка компиляции вашего кода

После настройки проверьте ваш sealed-класс:

javac TestSealed.java
java TestSealed

Ошибка должна исчезнуть. Если IntelliJ IDEA всё ещё использует старую версию — зайдите в File → Project Structure → SDK и выберите JDK 17 вручную.

Важные замечания

  • Homebrew: Если устанавливали JDK через brew install openjdk@17, путь может быть другим: /usr/local/opt/openjdk@17
  • Maven/Gradle: В файлах pom.xml или build.gradle тоже нужно указывать source/target версию
  • Переменная среды: Если вы используете Bash вместо Zsh, редактируйте ~/.bash_profile

После всех настроек перезапустите терминал или выполните source ~/.zshrc — и ваш проект будет использовать Java 17 по умолчанию.

<<>>

Альтернативный подход: Использование jEnv для управления JDK

Если вам нужно часто переключаться между версиями Java для разных проектов, рекомендую установить менеджер версий jEnv. Он работает аналогично nvm для Node.js или rvm для Ruby.

Установка jEnv через Homebrew

brew install jenv

Добавьте в ~/.zshrc:

export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"

Добавление JDK в jEnv

# Добавляем все установленные 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 /path/to/project
jenv local 21

Преимущества jEnv

  • Автоматически переключает версию Java при входе в папку проекта
  • Работает с Gradle, Maven, IntelliJ IDEA
  • Позволяет управлять не только JDK, но и JAVA_HOME, JAVA_OPTS
  • Поддерживает плагины (например, для Maven)

После настройки jEnv ваш sealed-класс будет компилироваться с правильной версией Java автоматически, без ручного экспорта переменных.