Gymterview
senior

Как мигрировать проект с Java 8/11 на Java 21/25?

Миграция с Java 8/11 на Java 21/25 выполняется поэтапно: сначала обновление JDK и зависимостей, затем переход javax -> jakarta (для Spring Boot 3.x), и наконец включение новых возможностей. OpenRewrite автоматизирует до 80% работы.

Этап 1: Подготовка

Пример
# Проверить совместимость зависимостей
./mvnw versions:display-dependency-updates
./mvnw versions:display-plugin-updates

# Ключевые зависимости для обновления:
# Spring Boot 2.x -> 3.x (требует Java 17+)
# Hibernate 5.x -> 6.x
# Lombok -> последняя версия
# Mockito -> 5.x+
# Jackson -> 2.15+

Этап 2: javax -> jakarta (при переходе на Spring Boot 3.x)

OpenRewrite конфигурация
# OpenRewrite — автоматическая миграция
./mvnw org.openrewrite.maven:rewrite-maven-plugin:run \
  -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-spring:LATEST \
  -Drewrite.activeRecipes=org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_0
<!-- Или добавить в pom.xml -->
<plugin>
    <groupId>org.openrewrite.maven</groupId>
    <artifactId>rewrite-maven-plugin</artifactId>
    <version>5.x</version>
    <configuration>
        <activeRecipes>
            <recipe>org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_0</recipe>
        </activeRecipes>
    </configuration>
</plugin>

Этап 3: Основные изменения при миграции

С версии Изменение Действие
Java 8 -> 11 Удалены JAXB, JAX-WS Добавить Jakarta зависимости
Java 8 -> 11 Module system (JPMS) Добавить --add-opens если нужен reflective access
Java 11 -> 17 Сильная инкапсуляция internal API --add-opens или заменить internal API
Java 17 -> 21 javax -> jakarta OpenRewrite
Any -> 21 SecurityManager удалён Убрать использование

Этап 4: Включение новых возможностей

Пример
# Virtual Threads (Java 21+)
spring.threads.virtual.enabled=true

# Полезные JVM-флаги
-XX:+UseZGC                    # ZGC для низкой латентности
-XX:+ZGenerational             # Generational ZGC (Java 21+)
Пример
// Постепенно обновлять код:
// 1. var для локальных переменных (Java 10+)
// 2. Records для DTO (Java 16+)
// 3. Text Blocks для SQL, JSON (Java 15+)
// 4. Switch Expressions (Java 14+)
// 5. Pattern Matching (Java 21+)
// 6. Sealed Interfaces для domain types

Частые ошибки

  • Мигрировать всё сразу — мигрируйте поэтапно: JDK -> фреймворки -> рефакторинг кода
  • Не обновить Lombok — Lombok сильно зависит от internal API JDK; каждая мажорная версия Java требует обновления
  • Не проверить reflection-зависимости — библиотеки, использующие sun.misc.Unsafe или internal API, могут сломаться
  • Игнорировать deprecation warnings — deprecated API могут быть удалены в следующей версии

Как используется в 2026

  • OpenRewrite — стандартный инструмент для автоматической миграции
  • Большинство enterprise-проектов завершили миграцию на Java 17/21
  • Миграция с Java 21 на 25 — минимальные изменения (в основном обновление зависимостей)

На собеседовании: покажите, что знаете поэтапный подход (JDK -> зависимости -> javax/jakarta -> рефакторинг) и инструмент автоматизации (OpenRewrite). Частая ошибка — пытаться обновить всё одним коммитом. Для senior-уровня упомяните --add-opens как временное решение и стратегию отказа от него.