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как временное решение и стратегию отказа от него.