Java обратно совместима, но зачем нам обновлять многие библиотеки при обновлении jdk с 1.6 до 1.8?

Недавно мы обновили версию JDK с 1.6 в 1.8 в одном из моих проектов Java. Но есть некоторые ошибки компиляции или времени выполнения, поэтому мне нужно обновить некоторые библиотеки:

  • Gradle: 1.9 в 1.10
  • весна: 3.x в 4.x

Это потому, что они используют некоторые ранние версии ASM, но поддерживает jdk 1.8 только из 5.x

Java сказала, что она обратно совместима, но почему оригинальные версии библиотек не могут работать с jdk 1.8 напрямую?

2 ответа

Решение

Потому что ASM - это инструмент, работающий с байт-кодом Java. И формат байт-кода изменился, чтобы ввести новые функции. Таким образом, вам пришлось обновить инструмент для поддержки нового байт-кода.

Обратите внимание, что программное обеспечение, скомпилированное с более старой версией JDK, не всегда работает с более новыми версиями Java. Например, enum не было ключевым словом в ранних версиях JDK.

ASM - библиотека довольно низкого уровня.

Он обрабатывает байт-код Java напрямую (тогда как "нормальное" приложение просто позволяет JVM загружать свои классы). Формат байт-кода время от времени меняется, и более старые версии не могут использоваться более старой JVM.

Работа с JDK или внутренними объектами формата класса не покрыта обратной совместимостью.

Это действительно крайний случай, и ASM - практически единственный "популярный" пример.


Более важным (и более распространенным) являются небольшие поведенческие изменения в коде системной библиотеки. Таким образом, ваше приложение будет работать технически, но все будет по-другому. В большинстве случаев вы этого хотите, поскольку это означает улучшение (например, повышение производительности), но иногда это может привести к ошибкам для вас.

Например:


Но в целом история совместимости устаревших приложений действительно хороша с Java. Они должны помнить об этом со всеми своими корпоративными клиентами.

Другие вопросы по тегам