Будет ли код, написанный для Java 8, работать на Java 17 без изменений?

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

Ответ

В большинстве случаев — да, благодаря обратной совместимости JVM. Но есть критические исключения, которые могут вызвать ошибки.

Основные причины проблем при миграции с Java 8 на 17:

  1. Удалённые API: Некоторые внутренние и устаревшие (deprecated) API были окончательно удалены.
    // Java 8: Работает
    // Java 17: java.lang.UnsupportedOperationException
    sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
  2. Модульная система (Project Jigsaw): Доступ к внутренним API модулей JDK (например, com.sun.*) теперь ограничен. Требуются явные разрешения в module-info.java.
  3. Устаревшие флаги JVM: Некоторые флаги виртуальной машины были удалены.
  4. Изменения в поведении: Некоторые методы, например, в коллекциях, могут вести себя строже.

Рекомендуемые действия перед миграцией:

  • Запустите jdeprscan для поиска использования устаревших API в вашем коде и библиотеках.
  • Обновите все зависимости до версий, совместимых с Java 17.
  • Протестируйте приложение с флагом --illegal-access=warn, чтобы найти проблемы с рефлексивным доступом.
  • Используйте jlink или jpackage для создания модульного приложения.