Зависит ли байт-код от версии Java, с которой он был создан?
Если бы я скомпилировал файл Java с самым новым JDK, сможет ли более старая JVM запустить файлы .class?
Ответ 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