Java JDK 11 损坏旧的Jars/程序

9
据我了解,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会对旧程序产生这些负面影响呢?
注意-我尝试将jar / EXE与JRE版本8(201)的javaw.exe相关联,但它们仍然具有相同的问题。

2
JDK11应该能够运行您的旧软件,但它不再包含以前的所有类,特别是J2EE。您需要单独将其添加到类路径中。 - daniu
1
每个JDK都包含一个JRE,具体取决于您选择的安装选项,它将覆盖现有的JRE或更改默认的JRE。 - Holger
1
您可以像以前一样继续使用JAF,无需更改任何代码。相反,您只需要下载独立版本的JAF并将其部署到类路径上即可。从Java SE中删除JAF已经被标记了很长时间。 - Alan Bateman
2个回答

6
Java试图保持向后兼容,但有时为了发展生态系统需要进行不兼容性更新。到目前为止,这些不兼容性更新都是在主要版本中发布的,例如Java 9、10、11。在您的情况下,您很可能受到Java 11的JEP 320:删除Java EE和CORBA模块的影响。
请记住,Java 8于2014年发布。在接下来的5年里,Oracle和Java社区为Java 8提供了补丁和安全修复,但永远这样做是不可能的。

假设使用JDK 8开发了一个程序,并发布供其他人使用,有一天新的Java JRE版本发布并被用户安装,那么他们就有可能无法再使用之前发布给他们的程序了? - Danjo
2
@Danjo 任何明智的软件都会在手册中说明需要哪些版本的JDK来运行。通常,正确的JDK会作为软件的一部分进行提供,例如IntelliJ就是这样,因为它运行在Java 8上。如果用户想尝试其他的JDK,那就由他们自己决定,但可能不受支持。 - Karol Dowbecki
抱歉如果我在这里问了一个愚蠢的问题,但是难道不应该是JRE运行已经构建好的jar和EXE文件吗?为什么安装新的“开发工具包”会影响已经编译好的程序呢? - Danjo
1
@Danjo javac 编译成字节码。这个字节码是一个 class 文件,稍后由 JVM 运行并转换为本地代码。这是一个两步过程,不像 C 语言中的 gcc 直接生成本地代码。https://dev59.com/pnVD5IYBdhLWcg3wOo5h#48153 - Karol Dowbecki
但是从主要的Java下载页面(大多数非开发人员会使用),您只能下载(版本8 201)的运行时?我想我问的基本上是,下载JDK 11是否有影响已经存在的程序(包括NetBeans),唯一的解决方法是卸载JDK 11?对您的编辑的回应:所以从jar中仍然需要编译,这就是JDK 11和删除类之间存在问题的地方? - Danjo
1
@Danjo 如果你的程序没有捆绑JVM,那么请找到该程序的文档并阅读支持哪些JVM版本。通常你可以安装多个不同的JVM,并使用程序启动选项选择要使用的JVM版本。你不仅限于一个Java版本。 - Karol Dowbecki

3
您面临的问题可能不是与字节码不兼容的问题,只是缺少一个类。
Java 11放弃了对一些旧技术的支持,例如Java Applets。如果在Java 11 JDK / JRE中运行Java 8 Applet,则会出现ClassNotFound异常,因为Java 11没有提供该类/ jar。
同样,对于JavaFX,它仍然存在,但不再是Java Distribution的一部分。您必须将其作为单独的Jar添加。
我认为可以将这些类添加到项目中。个人而言,我希望看到一个端口。

我认为你把ClassNotFoundException和NoClassDefFoundError混淆了。 - mangusta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接