Почему Eclipse жалуется, что в проекте указано соответствие компилятора 1.8, но используется JRE 11?

Я установил соответствие компилятора проекта Eclipse равным 1.8, потому что я хочу создавать файлы jar, которые можно запускать на компьютерах с установленной JRE 8.

Однако на моем компьютере разработки у меня установлена ​​только JRE 11. Я предположил, что это нормально, потому что ожидал, что JRE 11 сможет выполнять файлы 1.8 и выше.

Однако Eclipse выдает предупреждение об этом (которое я не могу найти способ отключить), а в диалоговом окне настроек компилятора говорится: «При выборе соответствия 1.8 убедитесь, что у вас установлена ​​и активирована совместимая JRE (в настоящее время 11)», что делает звучит так, как будто JRE 11 не совместим с 1.8. Так ли это на самом деле?

Какие именно неправильные предположения я делаю здесь?

Кроме того, действительно ли мне нужно иметь установленную JRE 8 для создания кода, совместимого с JRE 8?


person user118967    schedule 16.03.2019    source источник
comment
Должно быть хорошо, ваша версия eclipse не знает Java 11 (а eclipse использует свой собственный компилятор); вы можете обновить затмение.   -  person Elliott Frisch    schedule 16.03.2019
comment
в гранях проекта измените java 1.7 на 1.8   -  person Onkar Musale    schedule 16.03.2019
comment
Разумно использовать jdk 8, если вы собираетесь сделать свое приложение совместимым с java 8. Это связано с тем, что вы можете использовать функции java 11, которые недоступны в java 8 (только для устранения таких ошибок, как nosuchmethoderror во время выполнения ). Ваша конфигурация может привести к тому, что выходные файлы классов будут совместимы с java 8, но это не означает, что новые функции и API будут волшебным образом возможны на java 8. Я сам совершал эту ошибку в прошлом. Лучше построить на java 8.   -  person ernest_k    schedule 16.03.2019
comment
@ernest_k: это потому, что вы можете использовать функции java 11, которые недоступны в java 8. Если для моего проекта установлено соответствие 1.8, то этого не произойдет, верно? Eclipse выдаст мне ошибку, если я использую что-то выше 1.8.   -  person user118967    schedule 16.03.2019
comment
@ user118967 Неправильно. Попробуйте вызвать метод API, который был добавлен только в java 11. Готов поспорить, он будет компилироваться, но запуск этого метода на java 8 будет для вас сюрпризом ... Но есть инструменты, которые помогут предотвратить это, например, с maven. Но опять же, какой смысл компилировать с java 11? Проверьте ответ Эрамнера, он лучше всех выражается.   -  person ernest_k    schedule 16.03.2019
comment
Я пробовал, и он не компилируется. Я попытался использовать var i = 10, который является новой функцией Java 10, и Eclipse не принимает ее, потому что она обеспечивает соответствие 1.8. Смысл использования Java 11 в том, что это поддерживаемая в настоящее время версия OpenJDK. Кроме того, я избегаю коммерческой лицензии, которую Oracle требует для своих JRE.   -  person user118967    schedule 16.03.2019
comment
@ user118967 Я сказал, что методы API добавлены в java 11. Я знаю, что новый синтаксис языка не компилируется, и это не тот риск.   -  person ernest_k    schedule 16.03.2019
comment
@ernest_k Он не компилируется (например, "".strip()) при использовании опции --release, которая была введена именно для этого. Eclipse поддерживает эту опцию с Photon (4.8) и javac с Java 9. См. Мой ответ ниже.   -  person howlger    schedule 17.03.2019


Ответы (3)


В Проект> Свойства: компилятор Java установите флажок Использовать параметр '--release', чтобы избежать предупреждения.

Если использовать параметр '--release' и уровень соответствия компилятора установлен на 1.8, например, " foo ".strip() отображается как ошибка даже с Java 11 JDK, потому что _ 2 _, который был представлен в Java 11, отсутствует в Java 8.

введите описание изображения здесь

Смотрите также:

person howlger    schedule 16.03.2019

Если вы хотите быть уверены на 100%, скомпилируйте с тем же JDK, который вы будете использовать в производстве, по крайней мере, с той же основной версией. JRE 11 наверняка может выполнять файлы классов 1.8. Однако более старая JVM не сможет запускать новые файлы классов. Даже если вы нацеливаетесь на старую версию и создаете файлы классов, которые должны быть совместимы, вы, вероятно, компилируете с использованием более новых классов JDK, и API изменится. Это может привести к поломке вашего кода при попытке запустить его на более старой JVM.

В большинстве случаев это будет работать, но лучше перестраховаться! В этом случае прислушайтесь к предупреждениям, они правы.

РЕДАКТИРОВАТЬ: вместо параметра --release см. Ответ howlger.

person ewramner    schedule 16.03.2019
comment
вы, вероятно, компилируете новые классы JDK, и API изменится: если для моего проекта установлено соответствие 1.8, то я должен получить сообщение об ошибке, если попытаюсь использовать версии API выше 1.8, правильно? Но я вижу вашу точку зрения, что могут быть баги несовместимости. - person user118967; 16.03.2019
comment
Однако трудно поверить, что Eclipse выдаст предупреждение, потому что в нем могут быть ошибки. Предупреждения основаны на формальных спецификациях, поэтому, похоже, есть официальная причина, помимо более простой практической возможности ошибок и попыток их избежать. - person user118967; 16.03.2019
comment
Нет, это предположение неверно. Если вы нацеливаетесь на 1.8, компилятор сгенерирует код, который может работать на 1.8 JVM, но он будет компилироваться с имеющимися у него классами API. У него нет доступа к классам API, которые присутствовали в 1.8, если у вас установлено только 11 и есть изменения. Например методы добавлены. Документация @since присутствует в JavaDoc для читателей, но компилятор не выполняет таких проверок и не может, поскольку информация не записывается в файлы классов. - person ewramner; 17.03.2019
comment
@ewramner Компилятор выполняет такие проверки при использовании параметра --release. Eclipse поддерживает эту опцию с Photon (4.8) и javac с Java 9. См. Мой ответ. - person howlger; 17.03.2019

Есть ли шанс, что вы не установили JDK? Если я правильно помню, предупреждение было связано именно с этим. Похоже, в моей комбинации Eclipse, OpenJDK, Ubuntu отсутствует пакет openjdk-11-jdk.

person neun24    schedule 16.03.2019