【问题标题】:Java JDK 11 Breaking Old Jars/ProgramsJava JDK 11 打破旧的罐子/程序
【发布时间】:2019-01-30 11:38:41
【问题描述】:

据我了解,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,即使附带了它,它也应该向后兼容?

另外,我使用的是 Apache NetBeans 10,它在 Java 8 上运行良好,但是在我安装 JDK 11 后,NetBeans 10 仍然运行,但它的加载窗口又大又模糊,IDE 的图像也很模糊,而且所有文字更大。

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

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

【问题讨论】:

  • JDK11 应该运行您的旧软件,但它不再包含以前的所有类,尤其是 J2EE。您需要将它们单独添加到类路径中。
  • 每个 JDK 包含一个 JRE,根据您选择的安装选项,它会覆盖现有的 JRE 或更改默认的 JRE。
  • 您可以像以前一样继续使用JAF,您不需要更改任何代码。相反,您只需要下载 JAF 的独立版本并将其部署在您的类路径上。从 Java SE 中删除 JAF 已经被标记了很长时间。

标签: java backwards-compatibility java-11


【解决方案1】:

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 提供了补丁和安全修复程序,但永远这样做是不可能的。

【讨论】:

  • 所以说一个程序是使用 JDK 8 开发的,并且发布给其他人使用,并且有一天新的 Java JRE 版本出来并且用户安装它,他们有机会获胜'不能再使用发布给他们的程序了?
  • @Danjo 任何明智的软件都会在手册中说明运行它需要哪些版本的 JDK。通常,正确的 JDK 作为软件的一部分提供,例如IntelliJ 这样做是因为它在 Java 8 上运行。如果用户想尝试不同的 JDK,这取决于他们,但它可能不受支持。
  • 对不起,如果我在这里问一个愚蠢的问题,但不是应该运行已构建的 jar 和 EXE 的 JRE 吗?为什么安装新的“开发工具包”会对已编译的程序产生影响?
  • @Danjo javac 编译为字节码。此字节码是一个class 文件,稍后由 JVM 运行并转换为本机代码。两步过程不像说 C 中的 gcc 直接生成本机代码。 stackoverflow.com/a/48153/1602555
  • @Danjo 如果您的程序没有附带捆绑的 JVM,请查找该程序的程序文档并阅读支持哪些 JVM 版本。您通常可以安装多个不同的 JVM,并使用程序启动选项来选择使用哪个。您不仅限于一个 Java 版本。
【解决方案2】:

您面临的问题可能不是 w.r.t 不兼容。字节码。这只是一个缺失的课程。

Java 11 放弃了对一些旧技术的支持,例如 Java Applets。如果您在 Java 11 JDK/JRE 中运行 Java 8 Applet,您将收到 ClassNotFound 异常,因为 Java 11 不提供类/jar。

JavaFX 也是如此,它仍然存在,但不再是 Java 发行版的一部分。您必须将其添加为单独的 Jar。

我相信可以将这些类添加到项目中。我个人希望看到一个端口。

【讨论】:

  • 我认为您将 ClassNotFoundException 与 NoClassDefFoundError 混淆了
猜你喜欢
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
相关资源
最近更新 更多