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

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

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

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

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

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

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

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

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

Вы сообщить об этом затмению? Кроме того, каково содержимое вашего module-info.java и где он находится в структуре проекта?

Naman 30.10.2018 04:35

Вы используете устаревшую версию Eclipse, более раннюю, чем Java 11. Для Java 11 требуется Eclipse 2018-09 плюс подключаемый модуль Поддержка Java 11 для Eclipse 2018-09 (4.9). @nullpointer

howlger 30.10.2018 09:00

@howlge, 4.7.3a - это самая последняя стабильная версия. Я перепроверил здесь: eclipse.org/downloads/packages/release/oxygen. Есть ли другие последние обновления после 4.7.3a?

Gunjan Shah 30.10.2018 10:24

@nullpointer, файл module-info.java пуст только после объявления модуля. Та же самая оснастка модуля прилагается к вопросу.

Gunjan Shah 30.10.2018 10:26

В новом выпуске заканчивается обслуживание предыдущего выпуска. За Oxygen последовал Photon, за которым последовал 2018-09 (а Java 11 была выпущена после выпуска 2018-09): eclipse.org/downloads/packages/release

howlger 30.10.2018 11:16

Но модули были введены в Java 9 и с тех пор не менялись (насколько мне известно). Так разве Eclipse не может компилировать module-info.java?

Holger 30.10.2018 20:32

@nullpointer: об этой проблеме уже сообщалось сообществу Eclipse. Пожалуйста, обратитесь по этой ссылке: bugs.eclipse.org/bugs/show_bug.cgi?id=533390

Gunjan Shah 01.11.2018 05:43

Я скачал новую версию: 2018-09 (4.9.0). И он отлично работает с JDK 11. Я загрузил «Eclipse IDE для разработчиков Java EE» из местоположения: eclipse.org/downloads/packages/release/2018-09/r. И его рабочий файл с JDK 11. @Howlger: Не могли бы вы упомянуть то же самое в ответе, чтобы я мог отметить эту ветку как Готовую.

Gunjan Shah 01.11.2018 05:50

@Holger Да, но если уровень соответствия установлен меньше 9, файл module-info.java компилируется как обычный файл Java, а module в начале является синтаксической ошибкой согласно JLS.

howlger 01.11.2018 09:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
9
1 357
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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, токен модуль в начале .java file является синтаксической ошибкой, потому что module-info.java - это обычный файл Java в Java <= 8.

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

Это заставляет меня задаться вопросом, как работает это обнаружение. Это кажется поразительно ненадежным, если его нужно адаптировать для каждой новой версии Java. Вот что я бы сделал, чтобы обнаружить версию Java 9+: 1) использовать jrt-fs.jar для открытия содержащегося в нем образа модуля (он вам все равно понадобится, когда вы хотите скомпилировать с содержащимися классами) 2) прочитайте содержащийся java/lang/Object.class и номер версии его файла класса. 3) вычтите из этого числа 44. Для сред до Java 9 вам нужно будет открыть rt.jar, чтобы извлечь файл класса. Это работает с JDK 1.1 до JDK12ea. Так что же вместо этого делает Eclipse?

Holger 01.11.2018 11:26

Думаю, основная проблема - это версия, которая содержится в заголовке каждого файла .class (номер основной версии: два байта по смещению 6 и 7). К сожалению, версия файла класса Java будет увеличиваться с каждой версией Java, даже если формат файла класса не изменился (насколько мне известно, это было в случае с Java 10 (54) -> 11 (55)). Обратите внимание, что версия файла более высокого класса также может означать, что части не только неизвестны, но и байты должны интерпретироваться по-другому.

howlger 01.11.2018 11:56

Я имею в виду именно эту версию. Минимум, который должен понимать Eclipse, - это 55> 54 (как было сказано в моем предыдущем комментарии, я даже зашел так далеко, чтобы предположить, что вычитание 44 дает нам основную версию, пока ее не отзовут). Поэтому следует понимать, что более новая версия файла классов, чем 53, допускает уровень соответствия 9 или 10. Если не удается проанализировать файл класса, это совершенно другая проблема, поскольку уровень соответствия 8 или более ранней версии не решит эту проблему. Сравните с с этой известной проблемой.

Holger 01.11.2018 12:04

@Holger Это будет работать только в том случае, если формат класса был обратно совместим, что по определению не является. Например, если вы проигнорируете номер версии, возможно, файл с версией 60 можно будет прочитать без проблем, но неправильно (поскольку отдельные байты имеют разное значение).

howlger 01.11.2018 12:13

Как указано в связанном ответе, Eclipse - это известен тем, что пытается, несмотря на большее число. Если Eclipse только что сообщил «Неподдерживаемый JDK, номер версии xyz», проблем с этим нет. Но Eclipse этого не делает. Он все еще пытается, а иногда даже работает. Но возвращаться к уровню соответствия до Java 9, потому что номер версии выше 10, просто не имеет никакого смысла. И это не меняет шансов уйти от анализа файлов классов JDK. Файлы классов JDK не изменяются при изменении уровня соответствия проекта.

Holger 01.11.2018 12:30

@Holger «Но Eclipse этого не делает». Вы уверены? Я уже видел такие ошибки. Уровень соответствия устанавливается в диалоговом окне Новый проект Java (по умолчанию предварительно выбрано ранее выбранное значение). Конечно, в Eclipse Oxygen.3a вы можете исправить синтаксическую ошибку в module-info.java, установив уровень соответствия 9, но это не приведет к исчезновению красного восклицательного знака на проекте и соответствующей ошибки в представлении Проблемы (которое будет показаны из-за неподдерживаемой JRE и не были упомянуты / показаны в вопросе).

howlger 01.11.2018 12:57

Это противоречит вашему ответу «… И поэтому пока не может обнаружить Java 11 JDK / JRE. Обнаружение требуется, чтобы иметь возможность установить уровень соответствия компилятора Java 9 или выше.». Конечно, связанный ответ касается Java 8, и с тех пор все могло измениться. Но эти вопросы и ответы, кажется, согласуются с этим. Для всех остальных функций, например пытаясь использовать лямбда-выражения с уровнем соответствия 7, Eclipse выдаст соответствующее сообщение о том, что это не соответствует уровню соответствия. То же самое и с module-info. Но если JDK не поддерживается, он должен сказать это громко.

Holger 01.11.2018 13:11

@Holger На самом деле это было неправильно. Спасибо за указание на это. Я обновил ответ.

howlger 01.11.2018 13:35

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