Post

Java окружение: Switch JDK и Maven Toolchains на практике

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 выполняется на другой.

This post is licensed under CC BY 4.0 by the author.