针对较旧的 JDK 版本时,如何避免 NoClassDefFoundErrors 和 NoSuchMethodErrors?

Nat*_*tix 5 java compilation backwards-compatibility

假设我想编写一个针对某个 JRE 版本(例如 1.6)的应用程序,但在我用来开发它的计算机上安装了较新版本的 JRE(例如 1.7)。

简单的方法是将编译器级别设置为 1.6(我使用 Eclipse,但这可能不是很重要,因为问题很普遍)。然而,这还不够。设置编译器的源级别可确保源文件仅使用该 Java 版本可用的语言功能,因此生成的类文件具有正确的次版本,因此目标 JVM 将能够加载并运行它们。

但还有另一个更微妙的问题:如果我在代码中使用 1.7 中添加的类或方法,并尝试在安装了 1.6 运行时的计算机上运行该应用程序,则会失败并显示NoClassDefFoundErrorNoSuchMethodError

问题是同一个程序在开发机器上运行良好,因为安装在其上的 1.7 JDK 确实包含这些类。编译器或 IDE 也不会抱怨。我引用的类和方法不可用的唯一指示是Since 1.7JavaDoc 中的注释。

那么如何确保我永远不会使用旧版本 JRE 中不可用的类或方法呢?构建路径上始终具有准确的目标 JRE 版本的唯一可靠解决方案是吗?这意味着我需要在我的开发机器上为每种此类情况安装额外的 JDK(1.7、1.6、可能 1.5,甚至可能 1.4)。

And*_*son 3

在编译期间使用bootcpasspath指向 1.6 JRE(特别是rt.jar)的选项。这样做将强制检查所有引用的类、方法和属性是否确实存在于所提供的rt.jar.

有关更多详细信息,请参阅javac - 交叉编译选项。