Как применять стандарт Java 1.6 при компиляции в Ant?


Я использую 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.Редирект был включен в Java только с Java 7 (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

На этот раз компилятор может обнаружить проблему.

Как гарантировать, что Ant последовательно не компилируется (и выдает соответствующее сообщение об ошибке) всякий раз, когда файл java, который он компилирует, не совместим с Java 6?

1 3

1 ответ:

Атрибут source обеспечивает соответствие исходного кода уровню. Назначая source=1.6, вы просите компилятор гарантировать, что исходный код, с точки зрения синтаксиса , совместим со спецификацией Java 1.6.

Атрибут target к значению X говорит компилятору генерировать class файлы, которые будут читаться JVMs уровня по крайней мере X. Назначая target=1.6, Вы просите компилятор генерировать классы, которые будут читаться только JVMs уровня 1.6 и далее.

Ни один из этих параметров не диктует компилятору, какие библиотеки JDK следует использовать в качестве зависимостей времени компиляции. Если вы хотите гарантировать, что ваш код может работать на Java 1.6 JVM, то вы должны использовать компилятор javac, входящий в состав Java 1.6. Кроме того, вы, скорее всего, либо вообще опустите параметр target, либо сохраните его - но если вы сохраните его, убедитесь, что он действительно установлен в 1.6.