Что - флаг выпуска в компиляторе Java 9?

Java 9 javac имеет новый флаг --release:

> javac --help
...

--release <release>
    Compile for a specific VM version. Supported targets: 6, 7, 8, 9

Как это отличается от -source и -target флаги? Это - просто ярлык для -source X -target X?

62
задан 4 April 2017 в 03:07

2 ответа

Не точно.

JEP 247: Скомпилируйте для Более старых Версий платформ , определяет этот новый параметр командной строки, --release:

Мы определили новый параметр командной строки, --release, который автоматически настраивает компилятор для создания файлов класса, которые свяжутся против реализации данной версии платформ. Для платформ, предопределенных в javac, --release N, эквивалентно -source N -target N -bootclasspath <bootclasspath-from-N> . (шахта акцента)

Так не, это не эквивалентно -source N -target N. Причина этого дополнения указана в разделе "Motivation":

javac обеспечивает два параметра командной строки, -source и -target, который может использоваться для выбора версии языка Java, принятого компилятором и версией файлов класса, которые это производит, соответственно. По умолчанию, однако, javac компиляции против новой версии API платформы. Скомпилированная программа может поэтому случайно использовать API, только доступные в текущей версии платформы. Такие программы не могут работать на более старых версиях платформы, независимо от значений, переданных -source и -target. опции. Это - долгосрочная болевая точка удобства использования, так как пользователи ожидают, что при помощи этих опций получат файлы класса, которые могут работать на указанной версии платформ.

Короче говоря, указывая входные и выходные опции не достаточны для кросс-компиляции. Поскольку javac, по умолчанию, компиляции против новых из API платформы, они, как могут гарантировать, не будут работать на более старых версиях. Также необходимо указать -bootclasspath опция, соответствующая более старой версии, чтобы кросс-скомпилировать правильно. Это включало бы корректную версию API, чтобы скомпилировать против и допускать выполнение на более старой версии. Так как об этом очень часто забывали, было решено добавить один параметр командной строки, который сделал все необходимые вещи правильно кросс-скомпилировать.

Дополнительные материалы для чтения в списке рассылки и Документы Oracle . Исходная ошибка была зарегистрирована здесь . Обратите внимание, что начиная с интеграции этой опции, сборки JDK прибыли связанные описаниями API платформы более старых выпусков, упомянули под разделом "Risks and Assumptions". Это означает, что Вам не нужна более старая версия, установленная на Вашей машине для кросс-компиляции для работы.

77
ответ дан 31 October 2019 в 14:14

--release X больше, чем просто ярлык на -source X -target X, потому что -source и -target не достаточны для безопасной компиляции в более старый выпуск. Также необходимо установить -bootclasspath флаг, который должен соответствовать более старому выпуску (и об этом флаге часто забывают). Так, в Java 9 они сделали сингл --release флаг, который является заменой для трех флагов: -source, -target и -bootclasspath.

Так, это - пример компиляции в Java 1.7:

javac --release 7 <source files>

Примечание, что Вам не должны были даже устанавливать JDK 7 на Вашем компьютере. JDK 9 уже содержит необходимую информацию для предотвращения Вас от случайного соединения до символов, которые не существовали в JDK 7.

17
ответ дан 31 October 2019 в 14:14

Другие вопросы по тегам:

Похожие вопросы: