Що таке прапор --release у компіляторі Java 9?


85

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?


Відповіді:


106

Не зовсім.

JEP 247: Компіляція для старих версій платформи визначає цей новий параметр командного рядка--release:

Ми визначили новий параметр командного рядка --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 . Оригінальна помилка була подана тут . Зверніть увагу, що з моменту інтеграції цієї опції збірки JDK постачаються в комплекті з описами API платформи старих версій, згаданих у розділі "Ризики та припущення". Це означає, що вам не потрібна старіша версія, встановлена ​​на вашому комп'ютері, для перехресного компіляції.


один сумнів, чи можна було б використовувати функції з jdk 9-11 у коді, і він все ще працює на Java runtime 8?
Кріштіану

Ні, вони не були б присутні в двійковому
Rogue

Що вам подобається за допомогою "Platform API"? Щось на рівні байт-коду? або щось пов’язане з базовою платформою x86 чи API API?
Хосе Сіфуентес

2
@JoseCifuentes, "API платформи" тут дається API JDK, його версія, без позначки, --releaseбуде виведена з JDK, що використовується для компіляції, який, як правило, відрізняється від JDK, на який ви націлюєте, використовуючи -sourceта -target. Це може вас вкусити у випадку, якщо ви випадково використовуєте класи / методи, введені в ніколи не JDK, а той, який ви націлюєте. Це надзвичайно тонко на випадок, якщо компілятор вибере метод перевантаження, який був доданий у пізнішій версії порівняно з попередньою, яку ви передбачали, таким чином мовчки порушуючи двійкову сумісність.
Олівер Гонджа

30

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

Отже, це приклад компіляції до Java 1.7:

javac --release 7 <source files>

Зверніть увагу, що вам навіть не потрібно встановлювати JDK 7 на вашому комп’ютері. JDK 9 уже містить необхідну інформацію, щоб уникнути випадкового посилання на символи, яких не було в JDK 7.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.