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

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

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


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

10.11.2009 20:23:29
8 ОТВЕТОВ
РЕШЕНИЕ

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

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

4
29.07.2012 14:55:23
Нет, лучший способ компиляции для более старой Java - не использовать более старые версии, так как в них есть ошибки и проблемы с производительностью. Совет, которым я поделился в своем ответе - всегда использовать новейшие возможности, которые вы можете получить, но следуйте надлежащим советам по кросс-компиляции - исходит от Питера фон дер Ахе, который до недавнего времени был техническим руководителем javac.
Kevin Bourrillion 12.11.2009 00:06:59
В компиляторе есть несколько ошибок, так что это не совсем подходит. Кроме того, даже с ключами -target все еще возможно включить вызов метода, который присутствует в 1.6, но не в 1.4 (например, string.split ()). Никакое количество ключей -target не исправит это. С другой стороны, компиляция с более старым JDK гарантирует, что вы не потерпите неудачу ни с более старыми, ни с более новыми версиями JDK.
AlBlue 12.11.2009 00:35:57
Всегда есть ecj, если вы беспокоитесь об ошибках в javac.
Adam Goode 12.11.2009 00:55:24
@AlBlue, по вопросу «немного ошибок в компиляторе», да, их немного, но они действительно существуют, и я был укушен ими. Зачем с этим? А в вопросе несовместимости библиотек вы просто ошибаетесь - похоже, вы никогда не читали мой ответ.
Kevin Bourrillion 19.11.2009 20:07:16

Я не думаю, что это будет.

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

0
10.11.2009 20:33:16
Этот ответ вселяет большую уверенность. ;)
Chris Farmer 10.11.2009 20:27:33
И, конечно же, вы компилируете Explicity для обратной совместимости, как показано выше.
Seth 10.11.2009 20:37:58

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

Очевидно, что вы не сможете использовать более 1,5 функций, таких как Generics, Executors и т. Д.

5
10.11.2009 20:28:18
использование -target без других советов в ссылке на sun.com (см. мой ответ) опасно.
Kevin Bourrillion 10.11.2009 20:29:59
Что произойдет, если вы не используете переключатель? Вызовет ли JRE 1.4 ошибку?
Marcus Leon 10.11.2009 20:31:19
Скорее всего, это даст вам ошибку несовместимости классов или что-то подобное.
cjstehno 10.11.2009 20:35:08
Я столкнулся с ошибкой «Major Major Minor», когда попытался сделать то же самое.
Kushal Paudyal 10.11.2009 21:46:15
Нет, проблема только в том, что ваш код может случайно использовать метод библиотеки, которого нет в более старой версии платформы. Результат: NoSuchMethodError и т. Д. Во время выполнения.
Kevin Bourrillion 12.11.2009 00:05:13

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

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

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

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

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

8
12.11.2009 00:08:39
Я категорически не согласен. Если вы не хотите использовать javac, поставляемый с JDK той версии, на которой вы хотите развернуть, тогда используйте вместо этого компилятор Eclipse и выполняйте его под той версией Java, на которой вы хотите развернуть. Я считаю, что за последние 5 лет компилятор Eclipse проявил НАМНОГО больше внимания, чем javac.
Thorbjørn Ravn Andersen 9.07.2010 03:37:26

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

Удачи.

0
10.11.2009 20:34:01

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

1
10.11.2009 20:48:44

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

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

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

0
11.11.2009 08:46:47

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

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

0
27.08.2019 14:08:27