Выполняет ли компиляция Java с разными версиями JDK и одной и той же целевой и исходной версией?

Мы собираемся обновить нашу систему CI, которая создает сборки от Java 7 до Java 8. Позже мы хотели бы перенести проекты на Java 8 один за другим. Конечно, мы хотели бы иметь возможность создавать выпуски исправлений для более старых версий, которые по-прежнему используют Java 7.

Можем ли мы быть уверены, что никаких проблем не возникнет, если мы передадим один и тот же источник, целевую версию и исходную версию из JDK 7 в JDK 8? Мы тестировали машины разработки без каких-либо проблем.

До этого мы также постепенно обновляем серверы развертывания от JRE 7 до JRE 8.

Обратите внимание, что мы хотим сохранить единую Java JDK-установку в CI-системе, в противном случае это осложнится.

Чтобы сделать это более понятным: Меня больше интересует тот же результат исполнения, а не столько об одном и том же байт-коде. Тот же байт-код просто подтвердит первый (работает на том же JRE), если я это правильно понял.

Мы не будем использовать функции Java 8 в коде, пока у нас не будет всех развертываний, запущенных на Java 8. Таким образом, совместимость не является проблемой.

Ответ 1

Выполняет ли компиляция Java с разными версиями JDK и одной и той же целевой и исходной версии один и тот же байт-код?

Нет гарантий.

Действительно, два файла .class, созданные из одного и того же исходного кода с использованием одного и того же компилятора с одинаковыми параметрами на одном и том же оборудовании, будут иметь один и тот же байт-код, но файлы все равно могут отличаться из-за встроенных атрибутов метки времени компиляции.

Однако, если вы хотите сравнить условно эквивалентные файлы байт-кода, этот Q & A предлагает некоторые возможные варианты:


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

Ответ 2

Как указано в этом блоге @ https://blogs.oracle.com/darcy/entry/source_target_class_file_version.

Учитывая тот же исходный код, компиляторы из разных выпусков, настроенные на использование одного и того же источника и одной и той же цели (и того же самого bootclasspath!), могут генерировать разные файлы классов из-за исправлений ошибок или изменений во внутренних контрактах компилятора.

Но эта проблема не случится с вами, поскольку у вас есть тот же самый компилятор, который компилируется в разные целевые версии. Вам просто нужно исправить конкретное магическое число и байт-код, совместимые для этой версии. Это похоже на сохранение вашей версии в версии 1.8 и указание цели, которая является либо более низкой, либо равной версией. Рассматривая этот прошлый дефект, который был рассмотрен, кажется, что он должен работать, и Oracle работает над устранением таких несовместимостей. http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4175911

Дополнительные ресурсы, которые должны помочь:

Ответ 3

да!! это действительно зависит от кода. в некоторых случаях он может генерировать другой байт-код, но обычно он генерирует один и тот же байт-код в обычных случаях.

У разных JDK будут разные компиляторы Java, которые могут генерировать разные байт-коды для одного и того же исходного кода. Компилятор javac со временем эволюционировал.

Различные основные версии Java часто генерируют файлы классов, которые соответствуют различным версиям спецификации classfile.

Даже если вы ограничитесь одной установкой JDK, два прогона компилятора в том же исходном файле будут создавать не идентичные файлы .class.