java - 用于编译代码的 JDK 版本是否重要?

标签 java jvm

在与其他人的对话中,他们声称用于编译代码的 JDK 版本与用于运行编译代码的 JVM 版本无关。

这对我来说似乎很奇怪 - 从来没有 JDK 版本很重要的例子吗?功能是否始终只依赖于运行代码的 JVM,而不依赖于代码的编译方式?

https://stackoverflow.com/a/19554706/2687324谈论向后兼容性。 Java 代码是否也向前兼容?

最佳答案

不,您不一定能在旧 JRE 上运行使用新 JDK 编译的代码。已编译的类包含类文件格式的版本号;如果这比运行时预期的更新,它将拒绝加载该类。

大多数 Java 编译器都支持以旧 JRE 为目标的选项,从而生成比构建编译器时更旧的类文件格式。但是,如果您不针对旧版本的 Java 运行时库进行编译,您仍然会遇到麻烦。您的代码可能使用旧版 Java 中没有的新 API。即使您指定了较旧的目标,编译器及其当前版本的 API 也不会捕获此信息。

对于 OpenJDK 中的标准 javac 编译器,这些选项是 -target-bootclasspath。您可能还想设置 -source 选项以捕获需要支持的较新语言功能的使用,旧类文件不提供。

关于java - 用于编译代码的 JDK 版本是否重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29809231/

相关文章:

clojure - jit 不应该减少对 invokeDynamic 的需求吗?

jvm - 如何在 Windows 上为我的 JDK 分配 8 GB(而不是 1 GB)RAM

java - 写入 XLSX 文件 (POI) 时 JVM 崩溃

java - 在 Windows 7 上运行 Eclipse 未找到 JRE 和 JDK

java - 排序数组中的线性搜索 - Java

java - 如何在java中删除文本文件的第一行

java - 如何生成与从 JVisualVM 获得的线程转储类似的线程转储?

java - Android Room 实体 boolean 值与 DAO : Kotlin vs Java

Java - 如何将数据从 mysql 数据库转换为 JSON 数组?

java - 改进 XSLT 转换