5

我安装了 Java 7,但将我的项目 JDK 合规性设置为 Java 6。不幸的是,这与使用 Java 6 编译不同。

例如,接口在 Java 7 中javax.imageio.stream.ImageInputStream 扩展Closable,而在 Java 6 中并非如此。在我的设置下使用ImageInputStreamwhere aClosable可以很好地编译(Java 7 符合 Java 6),但在使用 Java 6 时会出现编译错误。这是假设的吗要这样吗?

4

3 回答 3

10

为了为较旧的 JRE 编译 Java 代码,您需要做两件事:

  • 适当设置合规级别。正如dystroy所解释的那样,这确保编译器生成旧JVM可以理解的字节码。
  • 使用旧的 Java 系统库。这可以确保您根据旧 JRE 附带的 Java 系统库版本(java.lang.*、java.net.* 等)进行编译。

您已经涵盖了第一点,但没有涵盖第二点,因此您的问题。

如何执行此操作取决于您的构建环境。

  • 在 Eclipse 中,要使用的 Java 系统库设置为构建路径的一部分:转到项目属性/Java 构建路径/库,然后删除错误的“JRE 系统库”并使用“添加库... ”。
  • 使用 plain 编译时javac,使用 option -bootclasspath。示例:(javac -target 1.5 -bootclasspath jdk1.5.0/lib/rt.jar OldCode.java来自javac 联机帮助页的“交叉编译选项”部分)。
于 2012-08-31T07:34:19.950 回答
6

您设置的 JDK 合规性主要是类格式。

类的字节码格式有几次演变。JDK 可以以以前的格式编译,而 VM 不能执行以更新的格式编译的类。

但是使用的库始终是您用于执行的 JDK 中可用的库。javax.imageio.stream.ImageInputStream 的 JDK 6 版本未与 Java 7 捆绑在一起。

于 2012-08-31T07:27:26.213 回答
3

bootclasspath编译时使用该选项。我认为如果进行交叉编译,JDK 7 会警告不要这样做。

于 2012-08-31T07:35:30.310 回答