应用程序能否同时具有 java 7 和 java 8 class 文件并部署在 java 8 JVM 上

Can an application have both java 7 and java 8 class files and deployed on java 8 JVM

我遇到了紧急情况。我有一个使用 java 7 编译的应用程序,同样是 Java 8 jvm 上的 运行。现在我需要修改某些文件。但是,我只有 java 8 sdk。我可以部署 java 8 个已编译的 class 文件吗? java 7 个字节的代码可以调用 java 8 个文件吗?

JVM 8 将从所有以前的编译器中 运行 class 文件。 class 文件调用在不同编译器上编译的另一个文件没有问题。当您使用第 3 方库并且您不关心使用哪个编译器构建 jar 文件时,这一点很明显。

当然,为 Java 7 编译的字节码可以使用为 Java 8 编译的 classes,假设 运行 在 Java 8 或者较新的 JRE。这正是当您的应用程序在 Java 8 环境中为 Java 7 运行 编译时发生的情况,因为您的 classes 使用的是 JRE classes .

但是这些为 Java 8 编译的 classes 不会在 Java 7 JRE 上 运行。如果这是有意的,您仍然可以使用 -target 1.7 选项让 Java 8 JDK 的 javac 命令为 Java 生成 class 文件] 7 环境。然而,也有陷阱。 javac 要求您还使用 -source 1.7 选项来启用 Java 7 目标,因此在这种情况下您不能使用新的语言功能,同时,您必须约束自己不要使用更新的 API 功能,这些功能在 Java 7.

中不存在

-bootclasspath 选项允许重定向到一组不同的 JRE classes 以避免此类错误,但由于您不想下载这样的环境,因此这不会帮不上忙这将通过 Java 9 JDK 解决。使用 JDK,您可以简单地指定 --release 7 选项,它结合了 -source 1.7-target 1.7-bootclasspath,而 JDK 提供了一个适当的API 说明本身。