Ответ 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, он может работать.