假设我想编写一个针对某个 JRE 版本(例如 1.6)的应用程序,但在我用来开发它的机器上,安装了更新版本的 JRE(例如 1.7)。
天真的方法是将编译器级别设置为 1.6(我使用 Eclipse,但这可能不是很重要,因为问题很普遍)。然而,这还不够。设置编译器的源代码级别可确保源文件仅使用该 Java 版本可用的语言功能,因此生成的类文件具有正确的次要版本,因此目标 JVM 将能够加载和运行它们。
但是还有另一个更微妙的问题:如果我在我的代码中使用 1.7 中添加的类或方法,并尝试在安装了 1.6 运行时的机器上运行应用程序,它会以 aNoClassDefFoundError
或NoSuchMethodError
.
问题是同一个程序在开发机器上运行良好,因为它安装的 1.7 JDK 确实包含这些类。编译器或 IDE 也不抱怨。我引用的类和方法不可用的唯一指标是Since 1.7
JavaDoc 中的注释。
那么如何确保我永远不会使用旧版 JRE 中不可用的类或方法呢?是始终在构建路径上具有准确目标 JRE 版本的唯一可靠解决方案吗?这意味着我需要在我的开发机器上为每个这样的情况(1.7、1.6、可能是 1.5,甚至可能是 1.4)安装一个额外的 JDK。