Ответ
Миграция с Java 8 на Java 11 требует планирования. Основные шаги и проблемы:
-
Анализ зависимостей и API:
- Используйте
jdepsдля анализа использования внутренних API JDK. - Запустите
jdeprscanдля поиска устаревших (deprecated) API в вашем коде и библиотеках. - Проверьте совместимость всех сторонних библиотек с Java 11.
- Используйте
-
Работа с удаленными модулями: Некоторые пакеты (например,
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> -
Обновление инструментов сборки: Убедитесь, что версии Maven, Gradle и их плагинов (особенно компилятора) поддерживают Java 11.
-
Обработка предупреждений о рефлексии: В Java 9+ был введен модульный доступ. Для legacy-кода, использующего рефлексию к внутренним API JDK, может потребоваться флаг JVM
--illegal-access=warn(илиpermitдля совместимости). -
Использование новых возможностей: После миграции можно начать использовать новые фичи 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). Красота!
Короче, план такой: не геройствуй, проверяй всё по списку, будь готов к тому, что какие-то библиотеки отвалятся, и не забудь про удалённые пакеты. А там, глядишь, и до новых фич доберёшься. Удачи, друг, не обосрись только в процессе.