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

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

Ответы [ 7 ]

41 голосов
/ 31 октября 2010

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

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

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

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

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

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

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


1 - JVMS Java 8 заявляет следующее: "Реализация виртуальной машины Java Oracle в выпуске 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-файл заднего порта в путь начальной загрузки, когда вы запустите код на более старой JVM.

10 голосов
/ 31 октября 2010

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

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

.
2 голосов
/ 31 октября 2010

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

2 голосов
/ 31 октября 2010

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

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

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

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

1 голос
/ 06 ноября 2010

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

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

javac -target 1.4 SomeClass.java

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

1 голос
/ 31 октября 2010

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

Да.

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

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

0 голосов
/ 06 ноября 2010

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

javac -target 1.5 MyJava.java

javac -цель 1.4 MyJava.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...