JDK合规 - 错误的安全性?

use*_*217 5 java compilation backwards-compatibility cross-compiling

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

例如,接口在Java 7中javax.imageio.stream.ImageInputStream 扩展,而Closable在Java 6中不是这种情况.在我的设置下使用ImageInputStreama a Closable期望编译正常(Java 7符合Java 6)但在使用Java 6时出现编译错误.这是假设这样吗?

sle*_*ske 10

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

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

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

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

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


Den*_*ret 6

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

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

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