Программа, созданная с помощью Java 8, может быть запущена на Java 7?

Я немного смущен.

  • Oracle говорит, что Java 8 очень совместим с Java 7 (назад). Но, какие возможности существуют, что Java 8-программа может быть успешно запущена на Java 7 (SE/EE)?

  • Если первая точка верна, приложения Java 8 будут развернуты и выполнены на сервере поддержки Java 7? например, Tomcat 8 или WildFly?

Ответ 1

В общем, нет.

Обратная совместимость означает, что вы можете запускать программу на Java 7 во время выполнения Java 8, а не наоборот.

Для этого есть несколько причин:

  • Bytecode версируется, а JVM проверяет, поддерживает ли он версию, найденную в файлах .class.

  • Некоторые языковые конструкции не могут быть выражены в предыдущих версиях байт-кода.

  • В новой JRE появились новые классы и методы, которые не будут работать со старыми.

Если вы действительно хотите по-настоящему (подсказка: вы этого не сделаете), вы можете заставить компилятор рассматривать исходный код как одну версию Java и испускать байт-код для другого, используя что-то вроде этого:

javac -source 1.8 -target 1.7 MyClass.java

(то же самое для Maven) и скомпилировать с JDK7, но на практике он будет чаще работать, чем работать. Я не рекомендую этого делать.

EDIT: JDK 8, по-видимому, не поддерживает эту точную комбинацию, поэтому это не сработает. Некоторые другие комбинации версий работают.

Существуют также программы для преобразования более новых программ Java для работы с более старыми JVM. Для преобразования Java 8 в 5-7 вы можете попробовать https://github.com/orfjackal/retrolambda. Чтобы получить ниже 5, вы можете выбрать один из них: http://en.wikipedia.org/wiki/Java_backporting_tools

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

Или, поскольку вы хотите запускать приложения Java 8 JEE на сервере приложений, просто запустите весь свой сервер на Java 8, он может работать.

Ответ 2

Средство обратной совместимости

Вы можете выполнить нижнюю конфигурацию в более высокой конфигурации, а не Vice-Versa.

Ответ 3

Ну, есть опция - target, которая позволяет вам настроить формат файлов классов предыдущих версий Java. Однако это не устраняет или не обнаруживает такие вещи, как использование классов или методов, внедренных в API JDK после целевой версии.

Ответ 4

Нет обратной совместимости означает, что Java7-программы будут запускаться под Java8, но обратное - не всегда true

Вы также можете проверить Oracle Limit Backward Compatibility

Ответ 5

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

Привет

Ответ 6

Я создал заглушки из WSDL, скомпилированные в java 8 и смог развернуть их на сервере с java 1.6 jvm на нем.