Java обратная совместимость, но почему нам нужно обновлять многие библиотеки при обновлении jdk с 1,6 до 1,8?

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

  • gradle: 1.9 до 1.10
  • spring: 3.x до 4.x

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

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

Ответ 1

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

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

Ответ 2

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

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

Взаимодействие с JDK или внутренними форматами формата не покрывается обратной совместимостью.

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


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

Например:


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