3

我使用 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 之后才包含在 Java 中(http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.Redirect。 html ). 所以它肯定不能在 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

这一次,编译器可以检测到问题。

每当它编译的 java 文件与 Java 6 不兼容时,如何确保 Ant 始终无法编译(并抛出适当的错误消息)?

4

1 回答 1

1

source属性强制执行源代码级别的合规性。通过分配source=1.6,您要求编译器确保源代码从语法的角度来看与 Java 1.6 规范兼容。

value的target属性X告诉编译器生成至少class可以被 JVM 读取的文件。通过分配,您要求编译器生成只有 1.6 级以上的 JVM 才能读取的类。 Xtarget=1.6

这些参数都没有指示编译器将哪些 JDK 库用作编译时依赖项。如果您想确保您的代码可以在 Java 1.6 JVM 上运行,那么您必须使用javacJava 1.6 附带的编译器。此外,您可能会target完全忽略该参数,或者保留它 - 但如果您保留它,请确保它确实设置为1.6.

于 2014-05-26T00:14:32.563 回答