Подтвердить что ты не робот

Что такое флаг -release в компиляторе 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?

4b9b3361

Ответ 1

Не совсем. Здесь ссылка на предложение для опции:

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

Нет, это не эквивалентно -source N -target N. Причина этого добавления указана в разделе "Мотивация":

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

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

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

Ответ 2

--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.