用Java 8制作的程序可以在Java 7上运行?

我有点困惑。

  1. 甲骨文表示,Java 8与Java 7高度兼容(落后)。 但是,Java 8程序可以在Java 7上成功运行(SE / EE)有什么可能?

  2. 如果第一点是真的,Java 8应用程序将被部署并在Java 7服务器支持上执行? 例如,Tomcat 8或WildFly?

一般来说,没有。

向后兼容性意味着您可以在Java 8运行时运行Java 7程序,而不是相反。

这有几个原因:

  • 字节码是版本化的,JVM会检查它是否支持在.class文件中find的版本。

  • 有些语言结构不能用以前版本的字节码表示。

  • 在较新的JRE中有新的类和方法,不适用于较旧的类。

如果你真的想要(提示:你不需要),你可以强制编译器将源代码当作Java的一个版本,并且为另一个版本发布字节码,使用类似下面的代码:

javac -source 1.8 -target 1.7 MyClass.java 

( 对于Maven来说是一样的 ),并且针对JDK7进行编译,但是在实践中,它往往不能工作而不是工作。 我build议你不要。

编辑 :JDK 8显然不支持这个确切的组合,所以这不会工作。 一些其他版本的组合可以工作。

还有一些程序可以将较新的Java程序转换成旧的JVM。 要将Java 8转换为5-7,您可以尝试https://github.com/orfjackal/retrolambda要获得低于5的值,可以select以下其中一个:; http : //en.wikipedia.org/wiki/Java_backporting_tools

这些黑客都不会给你新的Java 8类和方法,包括对集合,stream,时间API,未签名API等的函数式编程支持。 所以我会说这不值得。

或者,因为您想在应用程序服务器上运行Java 8 JEE应用程序,只需在Java 8上运行整个服务器即可。

后向兼容性意味着

您可以在较高configuration上运行较低configuration,而不是使用Vice-Versa

那么,有-target编译器选项,它可以让你定位以前的Java版本的类文件格式。 但是,这不会修复或检测诸如在目标版本之后使用JDK API中引入的类或方法的内容。

没有向后兼容性意味着Java7程序将在Java8下运行,但反过来并不总是如此

您也可以检查Oracle以限制从Java 9向Java 8的向后兼容性

一般来说,新版本必须提供向后兼容性,所以人们不必投入工作,可以轻松升级。 另一种方式(在旧版本中运行的更新版本)并不是真的,因为如果你使用了一些新的实现的function,那么这个function在以前的版本中显然不存在,并且不起作用。

问候

我从WSDL生成了存根,在java 8中编译,并能够将它们部署在具有java 1.6 jvm的服务器上。