Java окружение: Switch JDK и Maven Toolchains на практике
Поддержка проектов на разных версиях Java остается типичной задачей в корпоративной разработке. В одних системах используется Java 7, часть инструментов и плагинов требует Java 8, а на рабочей станции установлена Java 21. В результате возникает конфликт окружений: одни утилиты не запускаются на старой JVM, а старый код не компилируется на новой.
Распространенные решения через update-alternatives
или SDKMAN!
малоэффективны при работе с несколькими JDK одновременно. Они переключают только глобальную версию Java, но не позволяют изолировать версии для разных задач: одну — для сборки проекта, другую — для инструментов, третью — для IDE или тестов.
Рассмотрим практическую конфигурацию для Linux (Ubuntu), которая позволяет:
- установить несколько JDK на одной машине (Java 7, Java 8 и Java 21);
- переключать активную версию Java через простой shell-скрипт;
- запускать Maven на Java 8, при этом компилировать проект Java 7;
- подключить и использовать Maven Toolchains;
- интегрировать конфигурацию с IntelliJ IDEA и CI.
Решение подходит для долгоживущих enterprise-проектов, которые используют устаревшие версии Java, но требуют работы в современной среде разработки.
Проблема
Когда в системе одновременно присутствуют несколько версий Java, возникают следующие типовые ошибки среды:
Сценарий | Симптом |
---|---|
Maven запускается под Java 7 | Ошибка: Unsupported major.minor version 52.0 |
Переключена global Java на 8 | Старые зависимости не компилируются |
IntelliJ IDEA показывает красные модули | Несовместимость между SDK и Maven в проекте |
Команда mvn install работает только на CI | Локальная сборка не совпадает с окружением сервера |
JAVA_HOME задается вручную | Нестабильность и конфликты при сборке |
Причина этих проблем в том, что управление версиями Java выполняется на уровне одной переменной окружения JAVA_HOME
. Этого недостаточно в проекте, где одновременно используется несколько JDK. Для стабильного рабочего окружения необходима явная конфигурация Maven и изолированное управление версиями Java.
Установка нескольких версий JDK
Рассмотрим установку трех версий Java на одну систему Ubuntu: JDK 7, JDK 8 и JDK 21. Они будут использоваться для разных задач: Java 7 — для совместимости legacy-кода, Java 8 — для запуска Maven, Java 21 — как системная JVM по умолчанию.
Для практического использования нескольких версий Java необходимо установить их параллельно в один каталог. В примере ниже используется Ubuntu, но подход универсален для любой Linux-системы.
Каталог установки
Все JDK будут находиться в каталоге /usr/lib/jvm
, который является стандартным для Java на Linux:
1
sudo mkdir -p /usr/lib/jvm
Установка JDK 7
Скачиваем архив JDK 7 с официального сайта Oracle и распаковываем его:
1
2
tar -xzf jdk-7u80-linux-x64.tar.gz
sudo mv jdk1.7.0_80 /usr/lib/jvm/
Результат:
1
/usr/lib/jvm/jdk1.7.0_80
Установка JDK 8
Аналогично для JDK 8:
1
2
tar -xzf jdk-8u202-linux-x64.tar.gz
sudo mv jdk1.8.0_202 /usr/lib/jvm/
Результат:
1
/usr/lib/jvm/jdk1.8.0_202
Установка JDK 21
Современную версию можно установить через пакетный менеджер apt:
1
sudo apt install openjdk-21-jdk -y
Результат:
1
/usr/lib/jvm/java-21-openjdk-amd64
Проверка установленных JDK
Проверить содержимое можно командой:
1
ls /usr/lib/jvm
Переключение между версиями JDK
Переключаться между установленными версиями удобно через небольшой shell-скрипт. Он временно переопределяет JAVA_HOME и PATH в текущем терминале.
Создать файл ~/switch-java.sh:
1
nano ~/switch-java.sh
Содержимое:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
# --- Java switcher for environment ---
# Usage:
# source ~/switch-java.sh 7 | 8 | 21 | show
JDK7=/usr/lib/jvm/jdk1.7.0_80
JDK8=/usr/lib/jvm/jdk1.8.0_202
JDK21=/usr/lib/jvm/java-21-openjdk-amd64
case "$1" in
7)
export JAVA_HOME=$JDK7
;;
8)
export JAVA_HOME=$JDK8
;;
21)
export JAVA_HOME=$JDK21
;;
show)
echo "---------------------------------------"
echo "Current JAVA_HOME: $JAVA_HOME"
java -version 2>&1 | head -n 1
echo "---------------------------------------"
return 0
;;
*)
echo "Usage: source ~/switch-java.sh {7|8|21|show}"
return 1
;;
esac
export PATH=$JAVA_HOME/bin:$PATH
echo "---------------------------------------"
echo "✅ Switched to Java $1"
echo "JAVA_HOME=$JAVA_HOME"
java -version 2>&1 | head -n 1
echo "---------------------------------------"
Данный скрипт изменяет переменную JAVA_HOME
и обновляет переменную PATH
, добавляя в нее нужный bin
выбранного JDK. Это влияет на текущую сессию терминала.
⚠️ Сессия терминала — это текущее окно командной строки. Изменения окружения не сохраняются глобально и действуют только до закрытия этого окна.
Сделаем файл исполняемым:
1
chmod +x ~/switch-java.sh
Использовать нужно так:
1
source ~/switch-java.sh 8
Команда source используется для того, чтобы скрипт выполнялся в текущей сессии терминала и мог менять значения переменных окружения.
На данном этапе система готова к работе с несколькими версиями Java. Следующий шаг — подключение Maven Toolchains для сборки проекта на одной версии Java при том, что Maven выполняется на другой.