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 - практически единственный "популярный" пример.
Более важным (и более распространенным) являются небольшие поведенческие изменения в коде системной библиотеки. Таким образом, ваше приложение будет работать технически, но все будет по-другому. В большинстве случаев вы этого хотите, поскольку это означает улучшение (например, повышение производительности), но иногда это может привести к ошибкам для вас.
Например:
- переход на 64-битную JVM может потребовать больше памяти
- изменения в сборке мусора могут привести к неожиданным паузам
- включение парсера XML в собственно JDK требует изменений в упаковке или конфигурации веб-приложения
- характеристики памяти и времени выполнения подстроки String# полностью изменяются в "второстепенной" ревизии JDK
- сортировка коллекции с помощью специального (неправильно реализованного) компаратора неожиданно вызывает исключения, которые раньше не создавались
- Вызов Thread#stop(Throwable) (который никогда не был хорошей идеей и не рекомендуется в течение очень долгого времени), вызывает UnsupportedOperationException начиная с Java 8
- Обновлена поддержка Юникода, изменяющая сортировку и поведение для некоторых строк
- Изменения в компиляции дженериков
- Невозможность расширить BitSet и реализовать Set из-за новых методов по умолчанию
- Изменения в поведении округления
- И многие другие изменения в API и BPI
Но в целом история совместимости устаревших приложений действительно хороша с Java. Они должны помнить об этом со всеми своими корпоративными клиентами.