使用Java 8开发的程序可以在Java 7上运行吗?

时间:2014-03-24 13:11:22

标签: java backwards-compatibility java-8 java-server

我有点困惑。

  1. Oracle称Java 8与Java 7高度兼容(向后)。但是,Java 8程序可以在Java 7上成功运行(SE / EE)的可能性是什么?

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

6 个答案:

答案 0 :(得分:74)

一般来说,没有。

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

有几个原因:

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

  • 某些语言结构无法在以前版本的字节码中表示。

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

如果你真的,真的想要(提示:你没有),你可以强制编译器将源视为Java的一个版本,并使用以下内容为另一个版本发出字节码:

javac -source 1.8 -target 1.7 MyClass.java

the same for Maven),并针对JDK7进行编译,但实际上它通常不起作用而不是工作。 我建议你不要。

编辑: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上运行整个服务器,它就可以运行。

答案 1 :(得分:13)

向后兼容性意味着

您可以在高级配置上运行较低配置而不是Vice-Versa

答案 2 :(得分:6)

嗯,有-target编译器选项,它允许您定位以前java版本的类文件格式。但是,这不会修复或检测诸如在目标版本之后使用JDK API中引入的类或方法之类的事情。

答案 3 :(得分:3)

没有向后兼容性意味着Java7程序将在Java8下运行,但相反的是并不总是为真

您也可以查看Oracle Limit Backward Compatibility

答案 4 :(得分:2)

一般来说,新版本必须提供向后兼容性,因此人们不必抛弃他们的工作并且可以轻松升级。反过来说(旧版本中运行的较新版本)并不是必然的,因为如果你使用一些新的实现功能,那么这个功能在以前的版本中显然不存在,并且不起作用。

此致

答案 5 :(得分:-1)

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