用于编译代码的 JDK 版本是否重要?
Does the JDK version being used to compile the code matter?
在与其他人的对话中,他们声称用于编译代码的 JDK 版本与用于 运行 编译代码的 JVM 版本无关紧要。
这对我来说似乎很奇怪 - 从来没有 JDK 版本很重要的例子吗?功能是否总是只依赖于代码 运行 正在运行的 JVM,而不依赖于代码的编译方式?
谈论向后兼容性。 Java 代码是否也向前兼容?
不,您不一定 运行 在旧 JRE 上使用新 JDK 编译的代码。已编译的 classes 包含 class 文件格式的版本号;如果这比 运行time 预期的更新,它将拒绝加载 class.
大多数 Java 编译器支持针对较旧 JRE 的选项,生成比编译器构建时更旧的 class 文件格式。但是,如果您不针对旧版本的 Java 运行time 库进行编译,您仍然 运行 会遇到麻烦。您的代码可能使用旧版本 Java 中没有的新 API。使用当前版本 API 的编译器即使您指定了较旧的目标也不会捕获此信息。
对于 OpenJDK 中的标准 javac
编译器,这些选项是 -target
和 -bootclasspath
。您可能还想设置 -source
选项以捕获需要支持的较新语言功能的使用,旧的 class 文件不提供。
在与其他人的对话中,他们声称用于编译代码的 JDK 版本与用于 运行 编译代码的 JVM 版本无关紧要。
这对我来说似乎很奇怪 - 从来没有 JDK 版本很重要的例子吗?功能是否总是只依赖于代码 运行 正在运行的 JVM,而不依赖于代码的编译方式?
谈论向后兼容性。 Java 代码是否也向前兼容?
不,您不一定 运行 在旧 JRE 上使用新 JDK 编译的代码。已编译的 classes 包含 class 文件格式的版本号;如果这比 运行time 预期的更新,它将拒绝加载 class.
大多数 Java 编译器支持针对较旧 JRE 的选项,生成比编译器构建时更旧的 class 文件格式。但是,如果您不针对旧版本的 Java 运行time 库进行编译,您仍然 运行 会遇到麻烦。您的代码可能使用旧版本 Java 中没有的新 API。使用当前版本 API 的编译器即使您指定了较旧的目标也不会捕获此信息。
对于 OpenJDK 中的标准 javac
编译器,这些选项是 -target
和 -bootclasspath
。您可能还想设置 -source
选项以捕获需要支持的较新语言功能的使用,旧的 class 文件不提供。