Если бы я скомпилировал файл Java с самым новым JDK, сможет ли более старая JVM запустить файлы .class?

Зависит ли байт-код от версии Java, с которой он был создан?

Ответ 1

Если я скомпилировал java файл в новейшем JDK, может ли более старая JVM запускать файлы .class?

Это зависит от трех вещей:

  • Реальные версии Java, о которых вы говорите. Например, 1.4.0 JVM может запускать код, скомпилированный компилятором 1.4.2, но JVM 1.3.x не может 1.

  • Используемые флаги компиляции. Существует флаг -target компилятора, который сообщает ему генерировать код, который будет работать на более старой (целевой) JVM. Флаг -source компилятора указывает, что он принимает только старые функции языка JVM. (Этот подход не всегда работает, в зависимости от особенностей языка Java, используемых вашим кодом. Но если компиляция кода должна работать.)

  • Классы библиотек, которые использует файл класса. Если он использует классы библиотек, которые не существуют в старых библиотеках классов, то он не будет работать... если вы не можете включить JAR, который возвращает классы 2. Вы можете избежать этой проблемы, используя параметр -bootclasspath для компиляции кода с API-интерфейсов старой версии Java.

Зависит ли байт-код от версии java, с которой она была создана?

Да, по модулю выше указанных пунктов.


1 - Java 8 JVMS заявляет следующее: "Реализация Oracle Java Virtual Machine в версии JDK 1.0.2 поддерживает версии формата файла 45.0 через 45.3 включительно. JDK выпускает 1.1.* формат файла поддержки класса версии в диапазоне от 45.0 до 45.65535 включительно. Для k ≥ 2 релиз JDK 1.k поддерживает версии формата файла класса в диапазоне от 45.0 до 44+k.0 включительно."

2 - Обратный путь может быть проблематичным. Например: 1) Вещи, которые зависят от поддержки встроенного кода, скорее всего, потребуют от вас поддержки этого встроенного кода. 2) Скорее всего, вам нужно будет поместить любой файл JAR с обратным портом на путь bootclass при запуске кода на старшей JVM.

Ответ 2

Зависит ли байт-код от версии java, с которой она была создана?

Обычно да. Но с помощью опций -source, -target и -bootclasspath, 1,7 + компилятор может быть использован для создания двоичных файлов, совместимых с Java 1.1

Ответ 3

Байт-код JVM совместим в прямом режиме между основной версией JVM, но не поддерживает обратную совместимость. Однако для лучшей информации вам нужно будет прочитать заметки о выпуске JVM, потому что они обычно указывают, насколько совместима обратная совместимость с байт-кодом.

Измените пояснения, так как это вызвало обсуждение комментариев

Байт-код JVM является совместимым с переходом, так что байт-код из одной JVM совместим с более поздними версиями JVM. Например, вы можете взять байт-код из 1.4 JVM и запустить его в Java 5 или Java 6 JVM (помимо любых регрессионных проблем, как указал Эндрю).

Байт-код JVM не поддерживает обратную совместимость между JVM, так что байт-код из JVM не гарантированно работает в предыдущем выпуске JVM, как это было бы, если бы вы пытались запустить код, скомпилированный для Java 6 в 1,4.2 JVM.

Ответ 4

Прежде всего, все java файлы имеют байт версии в заголовке класса. Старые jvms не будут загружать классы с более новыми версиями, независимо от того, какие функции у них есть.

Ответ 5

Зависит ли байт-код от версии java, которую он создал с помощью?

Да.

Если я скомпилировал java файл в новейшем JDK, может ли более старая JVM запускать файлы .class?

Нет. Но, скорее всего, будет работать наоборот. Возможно, вам понравится этот интересный нить, в нем говорится о том, что вы передаете Java.

Ответ 6

Нет, если вы не указали в качестве цели старую JVM.

Например, с Java 6 вы можете компилировать и запускать на Java 1.4, используя:

javac -target 1.4 SomeClass.java

Очевидно, что исходный код должен быть совместим с 1.4.

Ответ 7

Вы можете скомпилировать классы, совместимые с JVM более старой версии, если вы не используете функции, доступные в более высоких JVM.

javac -target 1.5 MyJava.java

javac -target 1.4 MyJava.java