Управление несколькими JDK в Mac OS, Linux и Windows WSL2
Если вам, как и мне, приходится одновременно работать с несколькими проектами (как с легаси, так и с современными), а возможно, вы разрабатываете какую-то библиотеку или утилиту для пользователей с разными версиями Java, то вы поймете проблему с переключением между разными JDK.

В наши дни установка, управление и переключение между JDK при разработке становится непростой задачей, потому что большое количество разработчиков все еще работает с Java 8, хотя многие уже переходят на Java 11. Эта проблема может быть решена разными способами. В этой статье мы рассмотрим некоторые из них.
Ручной способ
Вы можете скачать дистрибутивы с сайта вендора JDK и установить их все вручную (или просто распаковать их в какую-нибудь папку вроде $user/jdks ) и все. Но тогда вам придется каждый раз проверять и обновлять JAVA_HOME , чтобы там была нужная вам JDK.
Это можно сделать с помощью bash-скриптов, bash-функций и т. д. В чем же тогда проблема? Вы просто можете забыть вызвать скрипт / функцию и поймете, что что-то пошло не так, только когда увидите UnsupportedClassVersionError .
Если вы предпочитаете все делать вручную, то можете покопаться в интернете для поиска решений. И это может быть хорошим вариантом для продвинутых пользователей. Но я использую для этого пару утилит. Итак, давайте посмотрим на них.
Лучший способ
На мой взгляд, идеальным решением будет объединение двух open source — инструментов, которые существуют уже довольно давно, и возможно, вы знакомы, по крайней мере, с одним из них. Но что вы не знаете, так это то, что их можно использовать вместе.
- SDKMAN!
- jEnv
Установка нескольких JDK
После установки SDKMAN! наберите:
$ sdk list java
Найдите нужного вендора, версию и введите:
$ sdk install java
Давайте установим четыре JDK: две последние версии Oracle OpenJDK и две LTS-версии AdoptOpenJDK.
При установке не выбирайте JDK по умолчанию.
- AdoptOpenJDK сборка OpenJDK 8u252 — LTS
- AdoptOpenJDK сборка OpenJDK 11.0.7 — LTS
- Oracle OpenJDK 14 — Последний GA
- Oracle OpenJDK 15 — Early Access сборка
Отлично. У вас есть четыре JDK, установленные локально с помощью SDKMAN! Я думаю, что эта утилита действительно удобна для установки JDK и, я надеюсь, она вам тоже понравилась.
Все установленные JDK можно найти в следующем каталоге:
$ cd /Users/bruno/.sdkman/candidates/java $ ls 11.0.7.hs-adpt 14.0.1-open 15.ea.20-open 8.0.252.hs-adpt
Если у вас нет необходимости часто переключаться между разными JDK, то этого будет достаточно. Вы можете использовать SDKMAN! для выбора JDK:
$ sdk current java Using java version 15.ea.19-open $ sdk default java 15.ea.20-open Default java version set to 15.ea.20-open
На этом можно остановиться и использовать только SDKMAN!, но рано или поздно, вы забудете переключить JDK точно так же как при ручном подходе. Поэтому я предпочитаю автоматическое переключение JDK.
Управление несколькими JDK с помощью jEnv
Несмотря на то что SDKMAN! удобен для установки JDK, но он не помогает при автоматическом переключении между разными JDK при переходе от одного проекта к другому. Здесь нам поможет jEnv.
После того как вы установите несколько JDK, с помощью SDKMAN! или любыми другими способами, вам нужно будет добавить их в jEnv:
$ cd ~/.sdkman/candidates/java $ ls -1 11.0.7.hs-adpt 14.0.1-open 15.ea.20-open 8.0.252.hs-adpt $ jenv add 15.ea.20-open openjdk64-15-ea added 15-ea added 15-ea added . $ jenv versions system 1.8 1.8.0.252 11.0 11.0.7 14.0 14.0.1 * 15-ea (set by /Users/bruno/.jenv/version) openjdk64-1.8.0.252 openjdk64-11.0.7 openjdk64-14.0.1 openjdk64-15-ea
Повторите команду jenv add для оставшихся трех версий JDK.
jEnv особенно удобен для тех, кто постоянно использует командную строку. Он позволит вам:
- Установить версию Java глобально для вашей системы.
- Установить версию Java для текущего каталога / проекта, в котором вы находитесь.
- Установить версию Java для текущего shell’а.
Автоматическое переключение между JDK
Теперь у вас установлены Java 8, 11, 14 и 15-EA. Итак, как же переключаться между ними? Давайте настроим версии и протестируем переключение.
Сначала нужно указать дефолтную глобальную JDK в системе. Для этого я обычно использую ранние сборки (Early Access). Всякий раз, когда я начинаю работать с новым проектом, я автоматически использую предстоящий релиз, что помогает мне выявить потенциальные проблемы, которые я могу сообщить в проект OpenJDK. Вы же тоже так делаете…
$ jenv global 15
Теперь для любой папки, в которой вы находитесь, при выполнении java -version вы получите OpenJDK 15 EA.
Если у вас есть проект, который должен использовать Java 8, то перейдите в папку и запустите:
$ jenv local 1.8
В результате будет создан файл под названием .java-version со следующим содержимым:
$ cat .java-version 1.8
Этот файл сообщает jEnv, какую JDK использовать, когда вы находитесь в этой папке.
Наконец, если вы и хотите временно переключиться на другую версию JDK, то используйте jenv shell .
Здесь есть демо, которое может пояснить все вышеописанное и как работает автопереключение.
После публикации статьи на Reddit были несколько интересных комментариев, о которых стоит здесь сказать:
- SDKMAN! с версии 5.8.1+ поддерживает sdk env и там тоже доступно автоматическое переключение.
- direnv очень хорош и не привязан к java. Делает то же самое, что и jEnv, за исключением того, что не помогает вам легко переключать JDK. Вы должны редактировать файлы вручную.
- autoenv — еще одна альтернатива direnv с теми же ограничениями.
- jabba — наиболее перспективная альтернатива сочетанию SDKMAN + jEnv, поскольку поддерживает весь их функционал и работает в Windows (PowerShell), что не поддерживается другими, упомянутыми выше, инструментами.
Еще по теме
- Миграции баз данных с Flyway
- Асинхронное логирование с log4j для любознательных
- OOMkiller в Docker сложнее, чем вы думаете
- Назад в будущее с курсом «Java-разработчик»
Как установить java 11 на mac os
This topic includes the following sections:
- System Requirements for Installing the JDK on macOS
- Determining the Default JDK Version on macOS
- Installing the JDK on macOS
- Uninstalling the JDK on macOS
- Installation FAQ on macOS Platform
System Requirements for Installing the JDK on macOS
The following are the system requirements for installing the JDK on macOS:
- Any Intel-based computer running macOS.
- Administrator privileges. You cannot install Java for a single user. Installing the JDK on macOS is performed on a systemwide basis for all users. Administrator privileges are required to install the JDK on macOS.
Determining the Default JDK Version on macOS
When starting a Java application through the command line, the system uses the default JDK.
There can be multiple JDKs installed on the macOS system.
You can determine which version of the JDK is the default by entering java -version in a Terminal window. If the installed version is 11 Interim 0, Update 0, and Patch 0, then you see a string that includes the text 11 . For example:
$ java -version java version "11" Java(TM) SE Runtime Environment (build 11) Java HotSpot(TM) 64-Bit Server VM (build 23.2-b04, mixed mode)
To run a different version of Java, either specify the full path, or use the java_home tool. For example:
$ /usr/libexec/java_home -v 11 —exec javac -version
Installing the JDK on macOS
To install the JDK on macOS:
- Download the required JDK .dmg or file from .tar.gz page:
- macOS x64 systems: jdk- 11 . interim.update.patch _macos-x64_bin.dmg OR jdk- 11 . interim.update.patch _macos-x64_bin.tar.gz
- macOS aarch64 (64-bit ARM) systems: jdk- 11 . interim.update.patch _macos-aarch64_bin.dmg OR jdk- 11 . interim.update.patch _macos-aarch64_bin.tar.gz
Click Accept License Agreement .
A Finder window appears that contains an icon of an open box and the name of the .pkg file.
The installation application displays the Introduction window.
The Installation Type window appears.
A window appears that displays the message: Installer is trying to install new software. Enter your password to allow this.
The software is installed and a confirmation window is displayed.
After the software is installed, you can delete the .dmg or .tar.gz file if you want to save disk space.
Uninstalling the JDK on macOS
To uninstall the JDK on macOS:
You must have Administrator privileges.
Do not attempt to uninstall Java by removing the Java tools from /usr/bin . This directory is part of the system software and any changes will be reset by Apple the next time that you perform an update of the OS.
- Go to /Library/Java/JavaVirtualMachines .
- Remove the directory whose name matches the following format by executing the rm command as a root user or by using the sudo tool:
/Library/Java/JavaVirtualMachines/jdk- 11 . interim.update.patch .jdk For example, to uninstall 11 Interim 0 Update 0 Patch 0: $ rm -rf jdk- 11 .jdk
Installation FAQ on macOS Platform
This topic provides answers for the following frequently asked questions about installing JDK on macOS computers.
1. How do I find out which version of Java is the system default?
When you run a Java application from the command line, it uses the default JDK. If you do not develop Java applications, then you do not need to worry about this. See Determining the Default JDK Version on macOS.
2. How do I uninstall Java?
3. After installing Java for macOS 2012-006, can I continue to use Apple’s Java 6 alongside the macOS JDK for Java 11 ?
If you want to continue to develop with Java 6 using command-line, then you can modify the startup script for your favorite command environment. For bash, use this:
$ export JAVA_HOME=`/usr/libexec/java_home -v 11`
Some applications use /usr/bin/java to call Java. After installing Java for macOS 2012-006, /usr/bin/java will find the newest JDK installed, and will use that for all of the Java-related command-line tools in /usr/bin . You may need to modify those applications to find Java 6, or contact the developer for a newer version of the application.
4. Can I restore Apple Java after uninstalling Oracle Java?
Go back to Apple Java using the following instructions:
- Uninstall Oracle Java by deleting the plug-in file. From a command-line, enter: $ sudo rm -rf «/Library/Internet Plug-Ins/JavaAppletPlugin.plugin»
- Create a symlink using the following command, entered on a single line: $ sudo ln -s /System/Library/Java/Support/CoreDeploy.bundle/Contents/JavaAppletPlugin.plugin «/Library/Internet Plug-Ins/JavaAppletPlugin.plugin»
5. What happened to the Java Preferences app in Application Utilities?
The Java Preferences app was part of the Apple Java installation and is not used by Oracle Java. Therefore, macOS releases from Apple that do not include Apple Java will not include Java Preferences.
Установка JDK (комплект разработчика Java): инструкция для Mac
Прежде, чем установить Android Studio, сделаем несколько подготовительных шагов. Некоторые из них покажутся вам технически сложными, не пугайтесь, если Вы плохо знакомы с терминологией.
Постарайтесь строго следовать инструкциям, а если увязнете, ищите подсказки на форуме.
-
Убедитесь, что у вас установлена Java.
Запуск командной строки
Прежде всего, нужно открыть так называемый терминал. Для этого нажмите на иконку поиска (увеличительное стекло) справа вверху экрана и введите с клавиатуры “terminal”.
Терминал можно также запустить из папки Программы > Утилиты
Используем терминал для поиска информации
Теперь можно проверить, установлена ли на вашем компьютере JDK версии 7 или выше. Для этого, наберите в открывшемся окне терминала команду:
java -version
и нажмите Enter
В примере ниже указана версия Java 8.0_45 — номер версии идет после “1.”

Если у вас установлена версия 7 или выше, переходите к следующему этапу — установке Android Studio.
Если JDK не установлен или его версия ниже седьмой, переходите ко второму шагу, который описан далее.
Загрузите комплект разработчика Java, он же JDK, с этого сайта.
У Oracle — компании, которая занимается поддержкой Java — очень много вариантов и сокращений. Но нам нужен старый добрый JDK. Это набор инструментов, необходимых для разработки приложений на Java.
Начиная с мая 2015 года иконка для скачивания JDK выглядит так:

Перейдя по этой ссылке, вы получите список доступных версий. Выберите из них Java SE Development Kit. Вам не нужен раздел Demos and Samples (его меню визуально похоже, так что внимательно читайте заголовки)
Инсталляция
Выберите JDK для своей операционной системы (Mac OSX). Если вашему компьютеру менее четырех лет, скорее всего, нужно выбрать версию 64-bit (она выделена ниже). Если компьютер постарше или вы сомневаетесь, какая версия нужна, поищите инструкции в интернете.

Подтвердите согласие с лицензионным соглашением и скачайте JDK. Кликните дважды, чтобы его инсталлировать.
Возвращаемся к шагу 1 и снова запускаем терминал, чтоб проверить, что установлена Java версии 7 или выше.
Как установить несколько версий Java на Mac OS
Необходимо скачать JDK. Загрузите tar.gz архив напрямую с официального сайта OpenJDK .
P.S. будьте внимательны при скачивании JDK, первая ссылка в гугле ведет на Oracle JDK, которая, с некоторых пор, для коммерческого использования запрещена без коммерческой лицензии. Поэтому обратите внимание, что скачиваете OpenJDK, которая распространяется свободно.
Шаг 2
Разархивируйте скаченный архив и скопируйте в стандартную директорию для Java в MacOS.
Если устанавливаешь для конкретного пользователя:
% mv ~/Downloads/jdk-11.jdk /Users/nikitabalily/Library/Java/JavaVirtualMachines
% mv ~/Downloads/jdk-11.jdk /Library/Java/JavaVirtualMachines/
Проверить текущую версию и все доступные можно с помощью утилиты:
% /usr/libexec/java_home -V
Шаг 3
Теперь, когда мы скачали и разархивировали в нужную папку несколько версий jdk, настроить переключение между версиями можно используя shell алиасы в вашем конфигурационном файле профиля для установки JAVA_HOME .
Если по используется ZSH (по умолчанию в MacOS Catalina):
% vim ~/.zshrc
% vim ~/.bash_profile
export JAVA_11_HOME=$(/usr/libexec/java_home -v11)
export JAVA_14_HOME=$(/usr/libexec/java_home -v14)alias java11='export JAVA_HOME=$JAVA_11_HOME'
alias java14='export JAVA_HOME=$JAVA_14_HOME'# default to Java 11
java11
% source ~/.bash_profile
Проверить текущую версию:
% java --version
Для переключения версии просто введите в терминале:
% java14
Источник эта статья на stackoverflow.
