如何找到支持的向后兼容的java版本?

问题描述 投票:0回答:2

是否可以通过命令行找到当前安装的JDK支持的所有向后兼容的Java版本?

我正在浏览命令行选项,但我找不到任何似乎提供此信息的选项。

提出这个要求是因为有两台不同的机器需要运行应用程序。在一台机器上安装了不支持 JAXB 的 JDK 11,而在另一台机器上安装了支持 JAXB 的 JDK 8。

更新: 基于“无论这意味着什么”的回答,我想扩展预期的内容:

$ java <command_line_option> 
JDK11, JDK10, JDK9, JDK8
java version backwards-compatibility
2个回答
1
投票

一般来说,新的 Java 版本与旧版本兼容,但有一些警告,因此假设的命令行选项应该列出所有以前的版本(或没有!);不过我确认您已经看到了:该命令行选项不存在。

无需搜索“向后兼容的 Java 版本”,只需调整应用程序以使其同时适用于 Java 8 和 Java 11:不需要太多时间,并且可能也适用于 Java 17 和 Java 21。

Java 11 可以运行使用 Java 8 编译的代码,但是正如您所知,一些库已从 JDK 中删除;因此,要在 Java 11 上运行 Java 8 应用程序,首先要做的是将缺少的库添加到其类路径中。如果您有一个 fat jar,您可以将这些库添加到 fat jar 中(如果您在 Java 8 上运行,它们是无害的)。另一件可能需要的事情是打开一些模块,例如使用此命令行选项:

--add-opens java.base/java.lang=ALL-UNNAMED


0
投票

您所要求的不存在,并且(一般意义上)不切实际,至少对于 Java 8 之后的 Java 版本而言。如果您将 Java 应用程序视为黑盒(除了其类文件版本号),您将无法在经过验证(和认证)的 Java 版本之后,预测它是否可以在任何版本的 Java 上运行。

所以你需要把它变成应用程序编写者的问题。让应用程序包含一个简单的启动器,用于测试它正在运行的 Java 版本。如果版本太新(或太旧),启动器应该退出并显示错误消息。如果 Java 版本可以接受,并且满足其他环境依赖性和前提条件,则启动器可以动态加载应用程序。

请注意,启动器需要特定于应用程序。但在简单的情况下,它只有一个受支持的 Java 主要版本号列表……由应用程序编写者在(大概)对所有可用的 Java 版本进行彻底测试后提供。

即使您不是应用程序编写者,您也可以实现此功能。编写通用版本检查启动器并将其与应用程序 JAR、JAR-in-JAR 类加载器和列出支持的 Java 版本的资源一起打包在 JAR 中会很简单。或者您可以将其实现为 shell 脚本或批处理文件。 (这是正常的做法...)


旁白:您的应用程序可能不应该旨在支持 Java 9 和 10 等非 LTS 版本。这些版本的生命周期很短,并且已被取代。 (事实上,在 Java 11 LTS 之后,非 LTS 版本在“生命周期结束”之前只有 6 个月的支持。)即使根据 Oracle 支持合同 (AFAIK),这些版本也无法获得补丁。

© www.soinside.com 2019 - 2024. All rights reserved.