JDK 14 运行 中制作的应用程序是否会在安装了 Java 版本 8 的计算机上运行?
Will an application made in JDK 14 run on a machine that has Java version 8 installed?
我的问题源于此...当您 google“下载 java”时,第一个结果是:https://www.java.com/en/download/
这会提示您安装 java 8。如果我正在使用 JDK 14 创建应用程序,我可以期望该应用程序在已安装的客户端计算机上 运行 java 来自上面的 link (Java 8)?此外,link 安装与我从 Java SE 14 安装页面 (https://www.oracle.com/java/technologies/javase/jdk14-archive-downloads.html) 安装的有什么不同?
不,使用 JDK 14 编译的 类 将具有不同版本的 Java 运行时 (58.0),但 JDK 8 仅支持最高 52.0 的版本.
$ $JDK_14/bin/javac Main.java
$ $JDK_8/bin/java Main
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: Main has been compiled by a more recent version of the Java Runtime (class file version 58.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:757)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access0(URLClassLoader.java:74)
at java.net.URLClassLoader.run(URLClassLoader.java:369)
at java.net.URLClassLoader.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
Will an application made in JDK 14 run on a machine that has Java version 8 installed?
答案是“否1 ...除非您在构建时做大量工作”。 (请参阅@andreos' 以了解如果您尝试 运行 Java 14 代码 Java 8 会发生什么。)
您需要解决几个问题才能使其正常工作:
除非您在编译代码时使用 --target
选项,否则编译器将生成具有对应 class 文件版本的“.class”文件到 Java 14。他们不会在 Java 8 平台上加载。 --help
选项应该告诉您 javac
在 Java 14.
中接受哪些较旧的目标版本
如果将 --target
选项设置为 8,则 --source
必须为 8 或更早。这意味着您将无法使用更新的 Java 语言 功能(例如模块)
除上述之外,您的应用程序需要针对 Java 8 class 库进行编译。如果您的代码使用 class 9 或更高版本中引入的 classes、方法等,它不会在 Java 8 上 运行。
如果您需要 运行 在 Java 8 平台上编译您的应用程序,那么简单的解决方案是在 Java 8 JDK 上编译您的应用程序。
或者,如果您想使用 Java 9+ 语言功能和 API(或为 Java 9+ 编写的第 3 方库),您将需要放弃支持 Java 8.这里没有简单的选择。
1 - 如果你想学究气,如果用户同时安装了 Java 8 和 Java 14,那么它会起作用......并且他们 运行 它使用 Java 14.
My question stems from this... when you google “download java” the first result is this: https://www.java.com/en/download/
我不明白为什么 Oracle 不解决这个问题。我猜是商业原因。
但您始终可以在 >>您的<< 应用程序的文档中包含有关下载适当版本 Java 的说明。或者,使用 jlink
+ jpackage
这样您的用户就不需要下载 JRE 或 JDK.
我的问题源于此...当您 google“下载 java”时,第一个结果是:https://www.java.com/en/download/
这会提示您安装 java 8。如果我正在使用 JDK 14 创建应用程序,我可以期望该应用程序在已安装的客户端计算机上 运行 java 来自上面的 link (Java 8)?此外,link 安装与我从 Java SE 14 安装页面 (https://www.oracle.com/java/technologies/javase/jdk14-archive-downloads.html) 安装的有什么不同?
不,使用 JDK 14 编译的 类 将具有不同版本的 Java 运行时 (58.0),但 JDK 8 仅支持最高 52.0 的版本.
$ $JDK_14/bin/javac Main.java
$ $JDK_8/bin/java Main
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: Main has been compiled by a more recent version of the Java Runtime (class file version 58.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:757)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access0(URLClassLoader.java:74)
at java.net.URLClassLoader.run(URLClassLoader.java:369)
at java.net.URLClassLoader.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
Will an application made in JDK 14 run on a machine that has Java version 8 installed?
答案是“否1 ...除非您在构建时做大量工作”。 (请参阅@andreos'
您需要解决几个问题才能使其正常工作:
除非您在编译代码时使用
中接受哪些较旧的目标版本--target
选项,否则编译器将生成具有对应 class 文件版本的“.class”文件到 Java 14。他们不会在 Java 8 平台上加载。--help
选项应该告诉您javac
在 Java 14.如果将
--target
选项设置为 8,则--source
必须为 8 或更早。这意味着您将无法使用更新的 Java 语言 功能(例如模块)除上述之外,您的应用程序需要针对 Java 8 class 库进行编译。如果您的代码使用 class 9 或更高版本中引入的 classes、方法等,它不会在 Java 8 上 运行。
如果您需要 运行 在 Java 8 平台上编译您的应用程序,那么简单的解决方案是在 Java 8 JDK 上编译您的应用程序。
或者,如果您想使用 Java 9+ 语言功能和 API(或为 Java 9+ 编写的第 3 方库),您将需要放弃支持 Java 8.这里没有简单的选择。
1 - 如果你想学究气,如果用户同时安装了 Java 8 和 Java 14,那么它会起作用......并且他们 运行 它使用 Java 14.
My question stems from this... when you google “download java” the first result is this: https://www.java.com/en/download/
我不明白为什么 Oracle 不解决这个问题。我猜是商业原因。
但您始终可以在 >>您的<< 应用程序的文档中包含有关下载适当版本 Java 的说明。或者,使用 jlink
+ jpackage
这样您的用户就不需要下载 JRE 或 JDK.