Будет ли JRE 1.4 поддерживать классы, скомпилированные с помощью Java 1.5 и 1.6?

StackOverflow https://stackoverflow.com/questions/1710933

Вопрос

Будет ли код, скомпилированный с использованием версий 1.5 и 1.6, работать на JRE 1.4?Мы не были уверены, какие версии Java поддерживает JRE 1.4.

Мы знаем, что если рассматриваемый код реализует функции, поддерживаемые версией 1.5 или 1.6, то он определенно не скомпилируется...и что есть некоторые риски с «обратной компиляцией», но не был уверен, откажется ли JRE 1.4 даже загружать скомпилированные классы 1.5/1.6 или нет.


Обновлять:Я подтвердил, что вы получите java.lang.UnsupportedClassVersionError исключение, если вы запускаете файл класса 1.6 в JRE 1.4.

Это было полезно?

Решение

Если вы просто строите со значениями по умолчанию javac 1.6 ваши файлы классов не будут работать в старых версиях Java.

Лучший способ компиляции для более старой версии Java — просто использовать команду старые версии JDK.Но если вы действительно хотите попробовать скомпилировать старую Java из более новой, вот несколько инструкций:

Другие советы

Вы можете выполнить кросс-компиляцию.В этом документе показано, как:

http://java.sun.com/javase/6/docs/technotes/tools/solaris/javac.html#crosscomp-example

Вы должны указать конкретную основную версию, на которую вы ориентируетесь (похоже на 1.4).

Используя этот метод, лучше всего всегда использовать новейший javac, который вы можете найти!Таким образом, у вас будут все последние исправления ошибок и улучшения производительности, и это будет совершенно безопасно.

РЕДАКТИРОВАТЬ:обратите внимание, что это решает проблему несовместимости библиотек, которая обсуждалась в нескольких ответах!

Только если вы скомпилируете с javac -target 1.4 выключатель.

Очевидно, вы не сможете использовать функции 1.5+, такие как Generics, Executors и т. д.

Вас также может заинтересовать http://en.wikipedia.org/wiki/Java_backporting_tools

Я не думаю, что это произойдет.

Иногда (по причинам, слишком сложным для объяснения) я пытаюсь запустить код в JRE 1.5, который я скомпилировал в JDK 1.6.Обычно он выдает исключение java.lang.UnsupportedClassVersionError.

Да и нет.Вы можете запустить код, скомпилированный под Java 6, на jvm 1.4, если вы установите параметры javac «source» и «target» для целевой версии (например,1.4) при их компиляции.Это будет работать в тех случаях, когда вы не использовали какие-либо дополнительные классы или возможности языка, добавленные после целевой версии.

Удачи.

Да, вы можете создавать файлы классов, совместимые с версией 1.4, с помощью компилятора 1.6 (javac), однако простое выполнение этого не обязательно приведет к созданию кода, который будет работать.Проблема в том, что это все равно будет компилироваться с версией API 1.6.

На первый взгляд вы не ожидаете, что это будет проблемой, поскольку контракты не должны меняться, но это так - у меня была проблема в том, что к BigDecimal (в 1.5) был добавлен новый конструктор, который принимает целое число IIRC, и поэтому во время компиляции был указан вызов этого конструктора, однако во время выполнения этот конструктор не существовал, поэтому возникло исключение во время выполнения.Вероятно, у вас возникнут подобные проблемы, когда методы перегружены и вы полагаетесь на автоматическое преобразование переменных.

Приложение Javac фактически не зависит от версии Java, к которой оно принадлежит — вы можете указать другой API для использования с Javac 1.6, и это следует сделать, чтобы избежать любых проблем во время выполнения.

Java 1.5 была основным выпуском, в котором были представлены перечисления, автобокс и другие возможности. При компиляции вы получите исключение, сообщающее о неподдерживаемой версии класса. Но если вы скомпилируете с помощью команды javac -source 1.4 -target 1._ claasname.java, она скомпилируется.

Если вы используете в этом сценарии такие функции версии 1.5, как автобокс и перечисления, они не будут скомпилированы, поскольку эти функции недоступны в версии 1.4. В этом случае нам необходимо преобразовать наш код в более старые версии на основе некоторых инструментов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top