【问题标题】:Can program developed with Java 8 be run on Java 7?用 Java 8 开发的程序可以在 Java 7 上运行吗?
【发布时间】:2014-03-24 13:11:21
【问题描述】:

我有点困惑。

  1. Oracle 表示 Java 8 与 Java 7(向后)高度兼容。但是,Java 8 程序在 Java 7(SE/EE)上成功运行的可能性有哪些?

  2. 如果第 1 点成立,Java 8 应用程序将在 Java 7 服务器支持上部署和执行?例如,Tomcat 8 或 WildFly?

【问题讨论】:

  • 向后兼容意味着 Java 7 将在 Java 8 下运行。为了在 Java 7 上运行 Java 8 字节码,我希望您需要使用逆向翻译类型的进程。
  • 我不明白你的第二个问题。你能澄清一下吗?
  • 您无法在 jdk 7 中运行 jdk 8 编译代码,但 jdk 7 编译代码无法在 jdk8 上运行。但是您可以使用 jdk8 编译 jdk 7 兼容代码,并在编译时指定一些属性,例如 javac -target 1.7 YourClass.java ...
  • 是的,我的意思是我是否可以使用 java 7 服务器来使用 java 8 进行开发,或者这是不可能的?
  • 我刚查了一下,WildFly 8 在 Java 8 上运行,Tomcat 有一些问题,但没有。

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


【解决方案1】:

一般来说不会。

向后兼容性意味着您可以在 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 上运行整个服务器,它就可以工作。

【讨论】:

  • 那么,这意味着我不能用 java 8 开发 jee 应用程序,因为它没有服务器?
  • 您是否尝试过在 Java 8 上运行您的服务器?也许它会起作用?
  • 嗯,一个带有tomcat8的hello world,运行良好。
  • 现在无法测试它,但我高度怀疑运行javac -source 1.8 -target 1.7 MyClass.java 甚至不会尝试做任何事情。有关详细信息,请参阅this thread(及其 cmets)。 AFAIK 你需要使用 Compiler API 来获得它。
  • 我也不同意“某些语言结构不能在以前版本的字节码中表达”,因为据我了解,retrolambda is based on the fact that they can be expressed
【解决方案2】:

向后兼容意味着

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

【讨论】:

    【解决方案3】:

    嗯,有-target 编译器选项,它可以让您针对以前的java 版本的类文件格式。但是,这并不能修复或检测目标版本之后使用 JDK API 中引入的类或方法等问题。

    【讨论】:

      【解决方案4】:

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

      您也可以查看Oracle Limit Backward Compatibility

      【讨论】:

      • 那篇文章的标题具有误导性。
      • @skiwi:- 是的,但我不认为内容具有误导性!另外我只是复制粘贴了文章的标题,因为我认为这篇文章可能会有所帮助!我错了吗?
      • 如果不使用任何 jdk8 功能怎么办,编译 1.8 和目标 1.8。它会起作用吗?
      【解决方案5】:

      一般而言,新版本必须提供向后兼容性,因此人们不必投入工作并且可以轻松升级。反之亦然(新版本在旧版本中运行)不一定正确,因为如果您使用一些新实现的功能,该功能显然在以前的版本中不存在并且将无法工作。

      问候

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2021-08-15
          • 1970-01-01
          • 1970-01-01
          • 2014-01-25
          • 2015-03-19
          • 1970-01-01
          • 1970-01-01
          • 2012-08-02
          相关资源
          最近更新 更多