Расскажите о вашем опыте миграции в последнем проекте.

Ответ

Да, я участвовал в миграции монолитного приложения с Java 8 на Java 11.

Основные задачи и вызовы:

  1. Обновление зависимостей: Анализ и обновление библиотек (Maven/Gradle), включая проблемные, такие как Lombok и JAXB, которые требовали совместимых версий для Java 9+.
  2. Замена устаревшего API: Поиск и рефакторинг кода, использовавшего deprecated API из javax.*, на их аналоги в jakarta.* или стандартной библиотеке.
  3. Работа с модульной системой (JPMS): Настройка module-info.java для разрешения зависимостей и доступа между модулями.
  4. Тестирование: Проведение всестороннего тестирования, особенно функционала, использующего Reflection и сериализацию, которые могли сломаться.

Пример изменения кода:

До миграции (использовался javax.xml.bind):

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement // В Java 9+ этот API был вынесен в отдельный модуль
public class User {
    private String name;
}

После миграции (используется jakarta.xml.bind):

import jakarta.xml.bind.annotation.XmlRootElement;

@XmlRootElement // Зависимость была явно добавлена в проект
public class User {
    private String name;
}

Процесс занял около трех месяцев и включал постепенный rollout на тестовых стендах перед выкаткой в production.

Ответ 18+ 🔞

А, ну это ж классика, блядь! Миграция с восьмой явы на одиннадцатую — это как переезд из развалюхи в новостройку, только в процессе всю мебель ломают, а половину вещей говорят «это, сука, теперь несовместимо, нахуй выбрось».

Основные пиздецы, с которыми столкнулся:

  1. Зависимости, ёпта! Открываешь pom.xml, а там как в старом комоде — одни кости да пыль. Каждая библиотека орет: «Я на восьмерке родилась, на восьмерке и помру!». Особенно эти выебнутые — Lombok да JAXB. С ними танцы с бубном, пока совместимую версию найдешь, чтоб она и с новой явой дружила, и друг другу в глаза не шипела.
  2. Устаревшее API, блядь. Весь этот javax.* взял да и отправили на пенсию. Сидишь, как дурак, ищешь по всему проекту эти импорты, а потом меняешь на jakarta.*. Чувствуешь себя археологом, который переписывает историю, ебать.
  3. Модульная система, ядрёна вошь! Эта module-info.java — просто пиздец головного мозга. Кто что от кого требует, кто кого экспортирует... Разбираешься, будто рассаживаешь пьяных родственников за свадебным столом, чтобы они не подрались.
  4. Тестирование, волнение ебать. Особенно всё, что связано с рефлексией и сериализацией. Работало же, сука, как часы! А теперь — хоба, и вылетает с ошибкой, потому что какой-то внутренний пакет теперь спрятан, как золото у жадного деда. Приходится всё ползком, на ощупь проверять.

Вот, смотри, как код преобразился, блядь:

Раньше было так (старая добрая javax):

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement // А в новых явах этот API, блядь, отдельным модулем пошёл, надо скачивать!
public class User {
    private String name;
}

А теперь вот так (модная jakarta):

import jakarta.xml.bind.annotation.XmlRootElement;

@XmlRootElement // Явно, блядь, добавили зависимость в проект, чтоб всё летало
public class User {
    private String name;
}

В общем, три месяца, сука, жизни. Три месяца постепенного выкатывания, когда каждый день просыпаешься с мыслью: «Ну что, на каком тестовом стенде сегодня всё ебнется?». Но в итоге-то завелось!