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

всегда ли Java поддерживала обратную совместимость исходного кода во время его разработки?

точнее: учитывая две версии Java X и Y с X

или существует только совместимость на уровне JVM: например, класс, скомпилированный для JVM 1.2, может запускаться JVM 5?

Если возможно запустить Java 2 код на Java 5 (или 6, или 7), каковы точные шаги, которые я должен выполнить? Непосредственно компиляции с компилятором Java 5? Компиляция с компилятором Java 2 и запуск на JVM 5?

6 ответов


Sun, и теперь Oracle, всегда были очень осторожны с обратной совместимостью в отношении Java.

двоичная совместимость: вы должны иметь возможность запускать Java-код, скомпилированный с более старыми версиями на более новых версиях без изменений. Однако могут быть небольшие несоответствия.

источник совместимости: код, первоначально написанный для более старой версии JDK, должен почти всегда компилироваться без изменений с более новой Java компилятор, но есть ряд небольших несовместимостей. Один из них -enum ключевое слово добавлено в Java 5; в более старых версиях Java,enum является допустимым идентификатором, но не на Java 5. Кроме того, импорт классов из пакета по умолчанию был удален (я думаю, начиная с Java 1.4). Так что вы не можете сделать:

import SomeClassName;

больше на Java 1.4 или более поздней версии.

в документации каждого выпуска JDK есть документ о обратной совместимости с предыдущими выпусками, который перечисляет детали.


запуск witg Java 1.5 enum стало зарезервированным словом. Таким образом, любой исходный код Java 1.4, содержащий enum сломался, начиная с 1.5


насколько я знаю, JVMs обратно совместимы. Класс, скомпилированный с JDK 1, будет работать в последнем JRE 7. Libraires определенно не на 100% совместимы. Некоторые методы были устаревшими (и впоследствии удалены). Некоторые классы изменили поведение (обычно) тонкими способами, которые заставят программы вести себя по-разному.


вы всегда можете работать с более новой версией JDK, чем та, которая используется для компиляции. Другой способ невозможен (если вы не компилируете с помощью ).

возможно, вы захотите прочитать документ (в частности Опции Кросс-Компиляции раздел), который объясняет целевой параметр и поведение по умолчанию


Java обычно совместим с предыдущими выпусками, но в любом случае это может быть много проблем с миграцией. См. мою статью о миграция из JDK 6 в 8 дополнительные сведения


вы можете посмотреть анализ обратной совместимости классов библиотеки Java (Jre) здесь:http://abi-laboratory.pro/java/tracker/timeline/jre/

отчет генерируется с помощью japi-compliance-checker.

enter image description here