Каковы ключевые шаги и проблемы при миграции проекта с Java 8 на Java 11?

Ответ

Миграция с Java 8 на Java 11 требует планирования. Основные шаги и проблемы:

  1. Анализ зависимостей и API:

    • Используйте jdeps для анализа использования внутренних API JDK.
    • Запустите jdeprscan для поиска устаревших (deprecated) API в вашем коде и библиотеках.
    • Проверьте совместимость всех сторонних библиотек с Java 11.
  2. Работа с удаленными модулями: Некоторые пакеты (например, javax.xml.bind, javax.activation) были удалены из JDK и стали опциональными. Их необходимо добавить как явные зависимости.

    <!-- Пример для Maven: добавление JAXB -->
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.5</version>
    </dependency>
  3. Обновление инструментов сборки: Убедитесь, что версии Maven, Gradle и их плагинов (особенно компилятора) поддерживают Java 11.

  4. Обработка предупреждений о рефлексии: В Java 9+ был введен модульный доступ. Для legacy-кода, использующего рефлексию к внутренним API JDK, может потребоваться флаг JVM --illegal-access=warn (или permit для совместимости).

  5. Использование новых возможностей: После миграции можно начать использовать новые фичи Java 9-11, такие как var для локальных переменных, улучшения в Stream API (takeWhile, dropWhile) и фабрические методы для коллекций (List.of(), Set.of()).

Ответ 18+ 🔞

Э, слушай, а вот эта ваша миграция с восьмой явы на одиннадцатую — это ж не просто так, на авось, переключить версию в настройках и побежали. Это, блядь, целый квест, если не сказать — операция по извлечению хуя из бутылки. Сейчас разложу по полочкам, но без паники, всё решаемо.

Первым делом, не лезь сломя голову. Берёшь свой проект и начинаешь его щупать инструментами, которые сами оракловцы дали. Запускаешь jdeps — эта штука покажет, где ты натырился внутренних API от JDK, которые теперь могут быть под замком. Потом jdeprscan — он как стукач, выявит все устаревшие вызовы в твоём коде и библиотеках. Если тут проблемы — пиши пропало, придётся копать. И да, проверь все свои сторонние либы — они точно на одиннадцатой взлетят? А то будет как в том анекдоте: «а у вас тут Spring образца 2014 года, он, сука, на новой джаве просто накрылся медным тазом».

Дальше — самое весёлое. Модульная система, ёпта. Кое-какие пакеты, без которых раньше жили как у Христа за пазухой (типа javax.xml.bind), теперь из коробки JDK выпилили. Их надо явно тащить как зависимости. Не хочешь — сиди на восьмой. Вот, смотри, как это в мавене выглядит, если тебе JAXB вдруг понадобился:

<!-- Пример для Maven: добавление JAXB -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.5</version>
</dependency>

И это ещё цветочки. Инструменты сборки — мавен, градл — их тоже надо апнуть до версий, которые эту самую одиннадцатую понимают. А то компилятор старый на новый байткод смотреть будет как баран на новые ворота.

Теперь про рефлексию. Раньше ты мог через неё лезть куда угодно, как к себе домой. А теперь модули стоят на страже. Если у тебя legacy-код шарится по внутренностям JDK, он начнёт сыпать предупреждениями. Чтобы не разбираться сразу (а разбираться, бля, надо), можно временно заткнуть его флагом --illegal-access=warn или permit. Но это как аспирин от рака — боль снимет, а проблему не решит. В будущем прижмут.

И вот, когда всё это, сука, пройдено, и приложение запустилось — можно выдохнуть и подумать о плюшках. Теперь можно начать использовать var для локальных переменных, чтобы не писать типы, которые и так очевидны. В Stream API появились takeWhile и dropWhile — очень удобные штуки. И, охуенно, фабричные методы для коллекций: List.of("a", "b"), Set.of(1, 2, 3). Красота!

Короче, план такой: не геройствуй, проверяй всё по списку, будь готов к тому, что какие-то библиотеки отвалятся, и не забудь про удалённые пакеты. А там, глядишь, и до новых фич доберёшься. Удачи, друг, не обосрись только в процессе.