【问题标题】:Compatibility and migration from Java 9 to Java 8从 Java 9 到 Java 8 的兼容性和迁移
【发布时间】:2017-05-12 07:41:38
【问题描述】:

我正在阅读关于新 Java 9 模块系统的 document

3 兼容性和迁移段落解释了如何迁移代码 从 Java 8 到 Java 9,但没有说明如何“迁移”或运行应用程序 用 Java 9 编写到 Java 9 之前的运行时。

所以,如果我有,比如说一个以模块化方式(每个模块都有一个模块描述符)编写的 JAR 应用程序,如果我将它部署在 JDK 8 运行时会发生什么?

【问题讨论】:

  • 如果兼容性是双向的,则不需要 Java 9
  • @xenteros Java 9 可能需要使用模块信息来扩充 jar(通过 module-info.java
  • 我不知道会发生什么,但您可能知道当您尝试运行使用 Java 的较新主要版本编译的应用程序时会发生什么。

标签: java java-9


【解决方案1】:

如果您的类文件是使用--release 8 标志编译的,那么它们应该在Java 8 上运行良好。module-info.class 文件将被旧版 JVM 忽略。

如果您的 Java 8 项目是基于 maven 的,您可以轻松地将其配置为包含 module-info.java:https://maven.apache.org/plugins/maven-compiler-plugin/examples/module-info.html

另外,请查看JEP 238(多版本 JAR 文件)。这使您可以在不破坏与 Java 8 的兼容性的情况下充分利用 Java 9 功能。

【讨论】:

    【解决方案2】:

    您不能使用小于为其构建的 JRE 启动 Java 应用程序。

    如果您只使用 javac 而不使用任何特殊选项,它将生成在 JRE 上运行的类等于或大于使用的 JDK 之一。

    不过 javac 支持交叉编译。您可以使用 JDK 8 编译 JDK 6 兼容的类文件。在javac docs 中搜索交叉编译选项

    【讨论】:

    • 这不是普遍正确的。但这是一个合理的指导方针。
    • 如果我使用 javac 编译器编译应用程序,即 Java 8?在我使用了 JDK8 的所有工具之后,即用于打包该应用程序的 jar?也许模块描述符被简单地忽略了?
    • 如果我不使用任何 Java 8 功能,我可以使用 Java 7 编译器编译用 Java 8 编写的应用程序。
    【解决方案3】:

    Java 类文件包含版本信息。与任何 Java 版本一样,应该不可能执行使用比运行时更新的主要版本编译的类文件(或 jar)。见:https://stackoverflow.com/a/4692743/6239524

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 2018-03-03
      相关资源
      最近更新 更多