用Java 8制作的程序可以在Java 7上运行?
我有点困惑。
-
甲骨文表示,Java 8与Java 7高度兼容(落后)。 但是,Java 8程序可以在Java 7上成功运行(SE / EE)有什么可能?
-
如果第一点是真的,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的服务器上。