Eclipse Oxygen выдает предупреждение об ошибке синтаксиса в файле информации о модуле

Я пытаюсь изучить новую концепцию модулей в JAVA. Я использую Eclipse Oxygen 4.7.3a с JDK 11.0.1.

Я получаю предупреждение об ошибке синтаксиса в моем файле module-info.java. Похоже, что компилятор не может разобрать новые ключевые слова файла module-info.java.

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

Я выполнил следующее решение, чтобы решить эту проблему:

  1. Установлены все обновления JAVA 11 из Eclipse URL обновлений JAVA 11: http://download .eclipse.org/eclipse/updates/4.9-P-builds

  2. Добавлен аргумент JVM "--add-modules=java.se.ee" в файл eclipse.ini.

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

Но проблема все еще есть. Любые предложения/вклады приветствуются!


person Gunjan Shah    schedule 30.10.2018    source источник
comment
Вы сообщили об этом в eclipse? Кроме того, каково содержание вашего module-info.java и где в структуре проекта оно размещено?   -  person Naman    schedule 30.10.2018
comment
Вы используете устаревшую версию Eclipse, более старую, чем Java 11. Для Java 11: Eclipse 2018-09 плюс Требуется поддержка Java 11 для Eclipse 2018-09 (4.9). @нулевой указатель   -  person howlger    schedule 30.10.2018
comment
@howlge, 4.7.3a — стабильная и последняя версия. Я проверил здесь: eclipse.org/downloads/packages/release/oxygen . Есть ли другие последние обновления после 4.7.3a?   -  person Gunjan Shah    schedule 30.10.2018
comment
@nullpointer, файл module-info.java пуст, только с объявлением модуля. Такая же оснастка модуля прилагается в вопросе.   -  person Gunjan Shah    schedule 30.10.2018
comment
Новый выпуск завершает обслуживание предыдущего выпуска. За Oxygen последовал Photon, за которым последовал 2018-09 (а Java 11 была выпущена после выпуска 2018-09): eclipse.org/downloads/packages/release   -  person howlger    schedule 30.10.2018
comment
Но модули появились в Java 9 и с тех пор не менялись (насколько мне известно). Так разве Eclipse не должен компилировать module-info.java?   -  person Holger    schedule 30.10.2018
comment
@nullpointer: об этой проблеме уже сообщалось сообществу Eclipse. Пожалуйста, перейдите по этой ссылке: bugs.eclipse.org/bugs/show_bug.cgi?id =533390   -  person Gunjan Shah    schedule 01.11.2018
comment
Я скачал новую версию: 2018-09 (4.9.0). И он отлично работает с JDK 11. Я загрузил Eclipse IDE для разработчиков Java EE из местоположения: eclipse.org/downloads/packages/release/2018-09/r . И его рабочий файл с JDK 11. @Howlger: Не могли бы вы указать то же самое, что и ответ, чтобы я мог пометить эту тему как «Готово».   -  person Gunjan Shah    schedule 01.11.2018
comment
@Holger Да, но если уровень соответствия установлен ниже 9, файл module-info.java компилируется как обычный файл Java, а module в начале является синтаксической ошибкой согласно JLS.   -  person howlger    schedule 01.11.2018


Ответы (1)


Требуется Java 11

или Eclipse 2018-12 (4.10), который выйдет 19 декабря 2018 г.

Eclipse Oxygen был выпущен до Eclipse Photon, Eclipse 2018-09 и Java 11, поэтому пока не может обнаружить Java 11 JDK/JRE.

Кроме того, уровень соответствия компилятора Java должен быть 9 или выше (Проект > Свойства: компилятор Java). чтобы иметь файл module-info.java с собственным синтаксисом, который был представлен в системе модулей платформы Java (JPMS) в Java 9. Если уровень соответствия компилятора ниже 9, маркер module в начале файла .java является синтаксической ошибкой, поскольку module-info.java является обычным файлом Java в Java ‹= 8.

Обратите внимание, что параметр в eclipse.ini относится к JRE/JDK, который используется для запуска Eclipse. JRE или более качественные (чтобы увидеть исходный код) JDK, используемые для разработки, должны быть указаны в Окно > Настройки: Java > Установленные JRE.

person howlger    schedule 01.11.2018
comment
Что заставляет меня задаться вопросом, как работает это обнаружение. Это кажется удивительно ненадежным, если его нужно адаптировать для каждой новой версии Java. Вот что я бы сделал, чтобы обнаружить версию Java 9+: 1) использовать jrt-fs.jar, чтобы открыть образ содержащегося модуля (он вам все равно понадобится, если вы хотите скомпилировать содержащиеся классы) 2) прочитать содержащийся java/lang/Object.class и номер версии файла класса. 3) вычесть 44 из этого числа. Для сред до Java 9 вам нужно было бы открыть rt.jar, чтобы извлечь файл класса. Это работает от JDK 1.1 до JDK12ea. Так что же делает Eclipse вместо этого? - person Holger; 01.11.2018
comment
Я предполагаю, что основная проблема заключается в версии, которая содержится в заголовке каждого файла .class (основной номер версии : два байта по смещению 6 и 7). К сожалению, версия файла класса Java будет увеличиваться с каждой версией Java, даже если формат файла класса не изменился (насколько я знаю, это было в случае с Java 10 (54) -> 11 (55)). Обратите внимание, что версия файла более высокого класса может также означать, что части не только неизвестны, но и что байты должны интерпретироваться по-разному. - person howlger; 01.11.2018
comment
Именно на эту версию я и ссылаюсь. Минимум, как должен понять Eclipse, это 55 > 54 (как сказано в моем предыдущем комментарии, я бы даже зашел так далеко, чтобы предположить, что вычитание 44 дает нам основную версию, пока не будет вызвано). Таким образом, следует понимать, что более новая версия файла класса, чем 53, допускает уровень соответствия 9 или 10. Если ему не удается разобрать файл класса, это совершенно другая проблема, так как уровень соответствия 8 или старше не решит эту проблему. Сравните с этой известной проблемой. - person Holger; 01.11.2018
comment
@Holger Это будет работать только в том случае, если формат класса будет обратно совместим, чего по определению нет. Например, если вы проигнорируете номер версии, может случиться так, что файл с версией 60 будет прочитан без проблем, но некорректно (потому что отдельные байты имеют разные значения). - person howlger; 01.11.2018
comment
Как указано в связанном ответе, Eclipse известен своими попытками, несмотря на большее число. Если Eclipse только что сообщил «Неподдерживаемый JDK, номер версии xyz», это не проблема. Но Eclipse этого не делает. Он все еще пытается и иногда даже работает. Но возвращаться к уровню соответствия до Java 9, потому что номер версии выше 10, просто не имеет смысла. И это не меняет шансов избежать парсинга файлов классов JDK. Файлы классов JDK не изменяются при изменении уровня соответствия вашего проекта. - person Holger; 01.11.2018
comment
@Holger Но Eclipse этого не делает. Вы уверены? Я уже видел такие ошибки. Уровень соответствия задается в диалоговом окне Новый Java-проект (по умолчанию предварительно выбрано ранее выбранное значение). Конечно, в Eclipse Oxygen.3a можно исправить синтаксическую ошибку в module-info.java, установив уровень соответствия 9, но это не сделает красный восклицательный знак на проекте и соответствующую ошибку в Проблемах view уходят (которые будут показаны из-за неподдерживаемой JRE и которые не были упомянуты/показаны в вопросе). - person howlger; 01.11.2018
comment
Это противоречит вашему ответу «… и поэтому пока не может обнаружить Java 11 JDK/JRE. Обнаружение необходимо, чтобы иметь возможность установить уровень соответствия компилятора Java 9 или выше». Конечно, связанный ответ касается Java 8, и с тех пор все могло измениться. Но эти вопросы и ответы, кажется, согласуются с этим. Для всех других функций, например. при попытке использовать лямбда-выражения с уровнем соответствия 7 Eclipse выдаст соответствующее сообщение о том, что это не соответствует уровню соответствия. Это должно быть сделано и для module-info. Но если JDK не поддерживается, это должно быть громко сказано. - person Holger; 01.11.2018
comment
@Holger На самом деле это было неправильно. Спасибо за указание на это. Я обновил ответ. - person howlger; 01.11.2018