我使用 JDK 7。但是,有一个类我想编译成Java 6标准(意味着它必须能够在JRE 6上运行)。我的 Ant 编译命令如下:
<target name="myAntTarget">
<javac srcdir="${mysrc.dir}"
destdir="${mydest.dir}"
source="1.6"
target="1.6"
deprecation="on"
debug="on"
classpathref="mypath"
includeAntRuntime="false"
>
<include name="com/mypackage/MyClassName.java" />
</javac>
</target>
奇怪的是,Java 6标准并没有得到一致的执行。
当我写的时候
ProcessBuilder.Redirect xxx = ProcessBuilder.Redirect.INHERIT;
System.out.println(xxx.toString());
代码已成功编译(意外),即使 ProcessBuilder.Redirect 仅在 Java 7 (http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.Redirect.html) 之后才包含在 Java 中。所以它肯定不能在Java 6中正常运行。
然而,当我写
try (BufferedReader br =
new BufferedReader(new FileReader("C:/myrandomfile.pdf"))) {
final String sss = br.readLine();
System.out.println(sss);
}
代码编译失败。错误消息(来自 Ant)是
error: try-with-resources is not supported in -source 1.6
这一次,编译器可以检测到问题。
如何确保 Ant 在编译的 Java 文件与 Java 6 不兼容时始终无法编译(并抛出相应的错误消息)?
source
属性强制实施源代码级合规性。通过分配 source=1.6
,您可以要求编译器确保源代码从语法的角度来看与 Java 1.6 规范兼容。
值 X
的 target
属性告诉编译器生成class
文件,这些文件将被级别至少为 X
的 JVM 读取。通过分配target=1.6
,您可以要求编译器生成只能由级别 1.6 以上的 JVM 读取的类。
这些参数都不指示编译器将哪些 JDK 库用作编译时依赖项。如果要确保代码可以在 Java 1.6 JVM 上运行,则必须使用 Java 1.6 附带的javac
编译器。此外,您可能会完全省略target
参数,或者保留它 - 但如果您保留它,请确保它确实设置为 1.6
。