Управление несколькими JDK в Mac OS, Linux и Windows WSL2

Автор оригинала: Bruno Borges
  • Перевод
И снова здравствуйте. В преддверии старта курса «Разработчик Java» подготовили для вас перевод интересной статьи.





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



В наши дни установка, управление и переключение между JDK при разработке становится непростой задачей, потому что большое количество разработчиков все еще работает с Java 8, хотя многие уже переходят на Java 11. Эта проблема может быть решена разными способами. В этой статье мы рассмотрим некоторые из них.

Ручной способ


Вы можете скачать дистрибутивы с сайта вендора JDK и установить их все вручную (или просто распаковать их в какую-нибудь папку вроде $user/jdks) и все. Но тогда вам придется каждый раз проверять и обновлять JAVA_HOME, чтобы там была нужная вам JDK.

Это можно сделать с помощью bash-скриптов, bash-функций и т. д. В чем же тогда проблема? Вы просто можете забыть вызвать скрипт / функцию и поймете, что что-то пошло не так, только когда увидите UnsupportedClassVersionError.

Если вы предпочитаете все делать вручную, то можете покопаться в интернете для поиска решений. И это может быть хорошим вариантом для продвинутых пользователей. Но я использую для этого пару утилит. Итак, давайте посмотрим на них.

Лучший способ


На мой взгляд, идеальным решением будет объединение двух open source — инструментов, которые существуют уже довольно давно, и возможно, вы знакомы, по крайней мере, с одним из них. Но что вы не знаете, так это то, что их можно использовать вместе.


Давайте посмотрим на их совместное использование.

Установка нескольких JDK



После установки SDKMAN! наберите:

$ sdk list java

Найдите нужного вендора, версию и введите:

$ sdk install java <id>

Давайте установим четыре JDK: две последние версии Oracle OpenJDK и две LTS-версии AdoptOpenJDK.

При установке не выбирайте JDK по умолчанию.

  1. AdoptOpenJDK сборка OpenJDK 8u252 — LTS
  2. AdoptOpenJDK сборка OpenJDK 11.0.7 — LTS
  3. Oracle OpenJDK 14 — Последний GA
  4. Oracle OpenJDK 15 — Early Access сборка

Эти четыре версии должны отвечать вашим потребностям для легаси-проектов на Java 8, для современных проектов на Java 11, а также для экспериментов с нововведениями в Java 14 и Java 15.

Отлично. У вас есть четыре 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 особенно удобен для тех, кто постоянно использует командную строку. Он позволит вам:

  1. Установить версию Java глобально для вашей системы.
  2. Установить версию Java для текущего каталога / проекта, в котором вы находитесь.
  3. Установить версию Java для текущего shell’а.

jEnv использует shim и автоматически управляет переменной окружения JAVA_HOME. Таким образом, после того как вы настроите вашу систему, jEnv будет переключать версию JDK на наиболее подходящую, на основе вышеуказанных приоритетов и текущей директории. Круто! У него есть и другие полезные функции — дополнительную информацию смотрите на сайте.

Автоматическое переключение между 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



Еще по теме


OTUS. Онлайн-образование
Цифровые навыки от ведущих экспертов

Похожие публикации

Комментарии 6

    +1
    Спасибо, не знал про sdk env.
      +3
      А разве недостаточно изменить JAVA_HOME и PATH?
        0

        На dzone.com есть статья How to Install Multiple Versions of Java on the Same Machine (Как установить несколько версий Java на одном компьютере) про SDKMan. Его основные фичи:


        • SDKMan бесплатен для использования и разработан сообществом открытого кода.
        • SDKMan написан на bash и требует наличия в вашей системе только программ curl и zip / unzip.
        • Вам не нужно беспокоиться об установке переменных окружения _HOME и PATH, поскольку SDKMan обрабатывает их автоматически.
          0
          Как девопс юзаю Alternatives. Но jenv нравится, спасибо.
            0

            asdf умеет управлять версиями вообще почти чего угодно через плагины.


            Вот плагин для джавы: https://github.com/halcyon/asdf-java

              0
              Intellij умеет обнаруживать установленные в SDKMAN JDK, предлагает их выбрать для проекта.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое