4

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

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

但是还有另一个更微妙的问题:如果我在我的代码中使用 1.7 中添加的类或方法,并尝试在安装了 1.6 运行时的机器上运行应用程序,它会以 aNoClassDefFoundErrorNoSuchMethodError.

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

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

4

1 回答 1

3

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

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

于 2012-09-22T01:31:31.223 回答