Если вам, как и мне, приходится одновременно работать с несколькими проектами (как с легаси, так и с современными), а возможно, вы разрабатываете какую-то библиотеку или утилиту для пользователей с разными версиями 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 по умолчанию.
- AdoptOpenJDK сборка OpenJDK 8u252 LTS
- AdoptOpenJDK сборка OpenJDK 11.0.7 LTS
- Oracle OpenJDK 14 Последний GA
- Oracle OpenJDK 15 Early Access сборка
Эти четыре версии должны отвечать вашим потребностям для легаси-проектов на Java 8, для современных проектов на Java 11, а также для экспериментов с нововведениями в Java 14 и Java 15.
Отлично. У вас есть четыре JDK, установленные локально с помощью SDKMAN! Я думаю, что эта утилита действительно удобна для установки JDK и, я надеюсь, она вам тоже понравилась.
Все установленные JDK можно найти в следующем каталоге:
$ cd /Users/bruno/.sdkman/candidates/java$ ls11.0.7.hs-adpt 14.0.1-open 15.ea.20-open 8.0.252.hs-adpt
Если у вас нет необходимости часто переключаться между разными JDK, то этого будет достаточно. Вы можете использовать SDKMAN! для выбора JDK:
$ sdk current javaUsing java version 15.ea.19-open$ sdk default java 15.ea.20-openDefault 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 -111.0.7.hs-adpt 14.0.1-open 15.ea.20-open8.0.252.hs-adpt$ jenv add 15.ea.20-openopenjdk64-15-ea added15-ea added15-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а.
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-version1.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