Java JDK 11 打破旧的 Jars/程序

标签 java backwards-compatibility java-11

据我了解,Java JRE 是向后兼容的,如果您使用 Java (JDK) 7 编写程序,它将使用 Java (JRE) 8 运行。

我有几个用 Java 8 开发的程序,还有我在完成它们时构建的 .jar 和 EXE 文件,它们总是运行良好。但是,在安装 Java JDK 11 (11.0.2) 之后,这些旧的 .jar 文件会损坏...

  • 其中一些仍在运行,但它们的 GUI 已经扩展,按钮和图像比以前更大,并且在某些情况下变得模糊
  • 一个程序根本不运行,尝试在控制台中运行它会出现异常:“线程“AWT-EventQueue-0”java.lang.NoClassDefFoundError 中的异常:javax/activation/ActivationDataFlavor

我了解到此类和其他一些 javax 类已从 JDK 11 中删除,因此从开发的角度来看,如果没有 Maven 等工具,您将无法再使用它们。但是我不明白为什么安装 JDK 11 对我的旧 jar 有任何影响,因为我没有安装新的 JRE,即使有新的 JRE,它也应该向后兼容吗?

此外,我使用 Apache NetBeans 10,它在 Java 8 上运行良好,但在我安装 JDK 11 后,NetBeans 10 仍然可以运行,但它的加载窗口又大又模糊,IDE 的图像也模糊,所有文字变大了。

那么为什么安装 JDK 11 会对旧程序产生这些负面影响?

注意 - 我已尝试将 jars/EXE 与 JRE 版本 8 (201) 中的 javaw.exe 相关联,但是,它们仍然存在相同的问题。

最佳答案

Java 试图向后兼容,但有时需要进行重大更改才能发展生态系统。到目前为止,重大更改随主要版本一起发布,例如Java 9、10、11。在您的情况下,您很可能受到 Java 11 的影响 JEP 320: Remove the Java EE and CORBA Modules .

请记住,Java 8 已发布 in 2014 . 5 年来,Oracle 和 Java 社区一直在为 Java 8 提供补丁和安全修复程序,但永远不可能做到这一点。

关于Java JDK 11 打破旧的 Jars/程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54439762/

相关文章:

java - 为什么在构建 docker 镜像时 apk jdk11 安装突然停止工作?

java - Java中如何检查4位数字代码中是否有双字母

java - GWT 中的泛型和集合,空指针

java - 如何在Java中获取当前时刻的年、月、日、小时、分钟、秒和毫秒?

java - 有没有办法让maven和eclipse生成相同的类文件

java - Java 版本之间是否存在向后不兼容的具体示例?

java - 从接口(interface)中省略公共(public)抽象会损害字节码兼容性吗?

c++ - 在 Visual Studio 2013 上编译旧的 C++ 代码

java - DateFormatSymbols 给出了错误的月/日翻译

Java 11 HttpClient 不允许 header 以冒号开头