Как применять стандарт 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 ответ:
Атрибут
source
обеспечивает соответствие исходного кода уровню. Назначаяsource=1.6
, вы просите компилятор гарантировать, что исходный код, с точки зрения синтаксиса , совместим со спецификацией Java 1.6.Атрибут
Ни один из этих параметров не диктует компилятору, какие библиотеки JDK следует использовать в качестве зависимостей времени компиляции. Если вы хотите гарантировать, что ваш код может работать на Java 1.6 JVM, то вы должны использовать компиляторtarget
к значениюX
говорит компилятору генерироватьclass
файлы, которые будут читаться JVMs уровня по крайней мереX
. Назначаяtarget=1.6
, Вы просите компилятор генерировать классы, которые будут читаться только JVMs уровня 1.6 и далее.javac
, входящий в состав Java 1.6. Кроме того, вы, скорее всего, либо вообще опустите параметрtarget
, либо сохраните его - но если вы сохраните его, убедитесь, что он действительно установлен в1.6
.