Будет ли JRE 1.4 поддерживать классы, скомпилированные с Java 1.5 и 1.6? - PullRequest
3 голосов
/ 10 ноября 2009

Будет ли код, скомпилированный с использованием 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.

Ответы [ 7 ]

8 голосов
/ 10 ноября 2009

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

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

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

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

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

5 голосов
/ 10 ноября 2009

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

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

4 голосов
/ 10 ноября 2009

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

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

1 голос
/ 10 ноября 2009

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

0 голосов
/ 11 ноября 2009

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

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

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

0 голосов
/ 10 ноября 2009

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

Удачи.

0 голосов
/ 10 ноября 2009

Не думаю, что так и будет.

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

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