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

«Каковы ключевые шаги и проблемы при миграции проекта с Java 8 на Java 11?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Миграция с 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()).