JDK合规 - 错误的安全性?

时间:2012-08-31 07:23:03

标签: java compilation cross-compiling backwards-compatibility

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

例如,界面javax.imageio.stream.ImageInputStream 在Java 7中扩展Closable,这在Java 6中不是这种情况。使用ImageInputStream,其中Closable在我的设置下编译正常(Java 7符合Java 6)但是给出了使用Java 6时编译错误。 这应该是这样吗?

3 个答案:

答案 0 :(得分:10)

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

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

你已经涵盖了第一点,但不是第二点,因此是你的问题。

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

  • 在Eclipse中,要使用的Java系统库被设置为构建路径的一部分:转到项目属性/ Java构建路径/库,然后删除错误的“JRE系统库”并使用“添加库”添加正确的“JRE系统库” ......“。
  • 使用普通javac进行编译时,使用选项-bootclasspath。示例:javac -target 1.5 -bootclasspath jdk1.5.0/lib/rt.jar OldCode.java(来自javac manpage,“交叉编译选项”部分)。

答案 1 :(得分:6)

您使用JDK合规性设置的内容主要是类格式。

类的字节码格式有几个变化。 JDK可以使用以前的格式进行编译,而VM无法执行以更新格式编译的类。

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

答案 2 :(得分:3)

编译时使用bootclasspath选项。我认为JDK 7警告不要这样做,如果做cross-compilation