Иногда может возникнуть необходимость использовать какую-то определенную версию Java для вашего проекта. Мы тоже в Surf с таким столкнулись при работе над одним из Flutter приложений-долгожителей. Решение нашлось в виде использования менеджера версий Java. Рассказываем, что за инструмент и как с ним базово работать на MacOS.
Что такое jenv
jenv — это менеджер для удобного управления версиями Java на локальной машине. Он позволяет легко переключаться между различными версиями Java, проводит разделение между глобальной версией Java и локальными версиями для использования в разных проектах, а также позволяет управлять переменными окружения Java в системе.
Возможности jenv
Управление версиями Java: jenv позволяет установить и использовать несколько версий Java на одной машине.
Поддержка различных ОС: jenv может использоваться на macOS, Linux и Windows;
Управление переменными окружения Java: jenv может автоматически установить переменные окружения Java;
Управление настройками JVM: jenv позволяет настраивать параметры JVM для каждой версии Java, такие как размер кучи, аргументы командной строки и т. д.
Применение для MacOS
Установка jenv
Устанавливать jenv на macOS рекомендую через brew.
$ brew install jenv
После установки прописываем jenv в ~/.zshrc через команды:
$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(jenv init -)"' >> ~/.zshrc
После выполнения этих команд надо удостовериться, что в ~/.zshrc есть строки:
export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"
Проверить установку можно через команду:
jenv doctor
Вывод может быть таким:
[OK] No JAVA_HOME set
[ERROR] Java binary in path is not in the jenv shims.
[ERROR] Please check your path, or try using ...
[OK] Jenv is correctly loaded
Ничего страшного, если есть ошибки, главное: Jenv is correctly loaded.
Установка Java
Получить список всех доступных JVM можно командой:
/usr/libexec/java_home -V
Если есть доступные JVM, то можно увидеть их список:
Matching Java Virtual Machines (6):
20.0.1 (arm64) "Oracle Corporation" - "OpenJDK 20.0.1" /Users/martynov/Library/Java/JavaVirtualMachines/openjdk-20.0.1/Contents/Home
17.0.8 (arm64) "JetBrains s.r.o." - "JBR-17.0.8+7-1000.8-nomod 17.0.8" /Users/martynov/Library/Java/JavaVirtualMachines/jbr-17.0.8/Contents/Home
15.0.10 (arm64) "Azul Systems, Inc." - "Zulu 15.46.17" /Users/martynov/Library/Java/JavaVirtualMachines/azul-15.0.10/Contents/Home
13.0.14 (arm64) "Azul Systems, Inc." - "Zulu 13.54.17" /Users/martynov/Library/Java/JavaVirtualMachines/azul-13.0.14/Contents/Home
11.0.19 (arm64) "Amazon.com Inc." - "Amazon Corretto 11" /Users/martynov/Library/Java/JavaVirtualMachines/corretto-11.0.19/Contents/Home
1.8.0_372 (arm64) "Amazon" - "Amazon Corretto 8" /Users/martynov/Library/Java/JavaVirtualMachines/corretto-1.8.0_372/Contents/Home
/Users/martynov/Library/Java/JavaVirtualMachines/openjdk-20.0.1/Contents/Home
Если список пуст или нет нужной версии Java, то ее можно установить так:
# Установка текущей версии:
brew install openjdk
# Установка нужной версии:
brew install openjdk@17
После установки, нужно выполнить несколько команд, которые предлагаются в Caveats (предостережениях):
sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
echo 'export PATH="/usr/local/opt/openjdk/bin:$PATH"' >> ~/.zshrc
export CPPFLAGS="-I/usr/local/opt/openjdk/include"
Добавление Java в jenv
Для добавления Java в jenv надо выполнить следующую команду (путь можно взять из списка доступных JVM выше):
jenv add /Users/martynov/Library/Java/JavaVirtualMachines/corretto-11.0.19/Contents/Home
Результат с подтверждением добавления:
corretto64-11.0.19 added
11.0.19 added
11.0 added
11.0.19 already present, skip installation
Список всех добавленных JVM можно посмотреть через команду:
Список всех добавленных JVM можно посмотреть через команду:
Результат будет примерно таким:
* system (set by /Users/martynov/.jenv/version)
11.0
11.0.19
15.0
15.0.10
17.0
17.0.8
corretto64-11.0.19
jetbrains64-17.0.8
zulu64-15.0.10
Использование различных версий Java через jenv
Глобальная версия
Для установки глобальной версии java нужно выполнить команду по аналогии с этой:
jenv global 15.0
После чего можно проверить версию командой:
java -version
Которая должна отразить выбранную версию:
openjdk version "15.0.1" 2020-10-20
OpenJDK Runtime Environment (build 15.0.1+9)
OpenJDK 64-Bit Server VM (build 15.0.1+9, mixed mode, sharing)
Локальная версия
Перед установкой нужной версии локально нужно перейти в папку с проектом.Для Flutter проекта это может быть папка /android.
Для установки локальной версии используется команда с нужной версией Java:
jenv local 17.0
Будет добавлен файл android/.java-version с выбранной версией внутри: 17.0. После проверяем установку локальной версии через команду:
jenv versions:
system
11.0
11.0.19
15.0
15.0.10
* 17.0 (set by /Users/martynov/Surf/flutter-project/android/.java-version)
17.0.8
corretto64-11.0.19
jetbrains64-17.0.8
zulu64-15.0.10
Еще можно на всякий случай проверить по другому.Перейти в папку в папку android и вызвать команду:
./gradlew -version
Убедиться, что используется нужная версия:
------------------------------------------------------------
Gradle 7.2
------------------------------------------------------------
Build time: 2021-08-17 09:59:03 UTC
Revision: a773786b58bb28710e3dc96c4d1a7063628952ad
Kotlin: 1.5.21
Groovy: 3.0.8
Ant: Apache Ant(TM) version 1.10.9 compiled on September 27 2020
JVM: 17.0.8 (JetBrains s.r.o. 17.0.8+7-b1000.8)
OS: Mac OS X 13.4.1 aarch64
Источник: https://www.jenv.be – официальный сайт jenv.
Больше интересного контента для разработчиков → в телеграм‑канале Surf Flutter Team
П.с там публикуем кейсы, лучшие практики, новости и вакансии Surf, а также проводим прямые эфиры.