java - 如果我用最新的 JDK 编译了一个 Java 文件,旧的 JVM 是否能够运行 .class 文件?

标签 java jvm

字节码是否取决于创建它的 Java 版本?

最佳答案

If I compiled a java file in the newest JDK, would an older JVM be able to run the .class files?

这取决于三件事:

  • 您所谈论的实际 Java 版本。例如,1.4.0 JVM 可以运行由 1.4.2 编译器编译的代码,但 1.3.x JVM 不能1

  • 使用的编译标志。有一个 -target 编译器标志告诉它生成将在旧的(目标)JVM 上运行的代码。 -source 编译器标志告诉它只接受旧 JVM 的语言特性。 (这种方法并不总是有效,具体取决于您的代码使用的 Java 语言功能。但如果代码编译通过,它应该有效。)

  • 类文件使用的库类。如果它使用旧类库中不存在的库类,那么它将无法运行……除非您可以包含一个向后移植这些类的 JAR2。您可以通过使用 -bootclasspath 选项针对旧版 Java 的 API 编译您的代码来避免此问题。

Does the bytecode depend on the version of the java it was created with?

是的,对上面的点取模。


1 - Java 8 JVMS 指出:“JDK 版本 1.0.2 中的 Oracle Java 虚拟机实现支持类文件格式版本 45.045.3(含)。JDK 版本 1.1.* 支持 45.045.65535(含)范围内的类文件格式版本。对于 k ≥ 2,JDK 版本 1.k 支持 45.044+k.0 范围内的类文件格式版本。"

2 - 向后移植也可能有问题。例如:1) 依赖 native 代码支持的事物很可能需要您实现该 native 代码支持。 2) 当您在较旧的 JVM 上运行代码时,您很可能需要将任何后向端口 JAR 文件放入引导类路径。

关于java - 如果我用最新的 JDK 编译了一个 Java 文件,旧的 JVM 是否能够运行 .class 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39555828/

相关文章:

java - Google Cloud Run for Anthos on GKE 的服务如何连接到不同组织的不同项目上的 Firestore?

java - 在 iReport 中使用 SVG 文件会出现 JRExpressionEvalException : Error evaluating expression : Source Text

java - 为什么java.base中有些方法不能被AOT编译器编译

java - 设置最大堆大小是否会影响字符串池大小?

java - 多个递归方法调用的各种堆栈大小

java - 获取和释放 java 监视器锁(同步块(synchronized block)、可重入锁等)是否需要上下文切换到内核空间?

java - 渲染不同的VAO

java - 如何使用 PreparedStatement 从 Java 应用程序将 POINT 类型值插入到 Postgresql 数据库中

java - 单线 Sonar 插件maven测试中的多个问题

scala - 我可以使用 scala-native 在没有 JVM 的情况下运行我的 scala 程序吗?