Я пытаюсь изучить новую концепцию модулей в JAVA. Я использую Eclipse Oxygen 4.7.3a с JDK 11.0.1.
Я получаю предупреждение об ошибке синтаксиса в моем файле module-info.java. Кажется, что компилятор не может анализировать новые ключевые слова файла module-info.java.
Я выполнил следующее решение, чтобы исправить эту проблему:
Установлены все обновления JAVA 11 из Eclipse Обновления JAVA 11 URL: http: //download.eclipse.org/eclipse/updates/4.9-P-builds
Добавлен аргумент JVM "--add-modules = java.se.ee" в файл eclipse.ini.
Но проблема все еще существует. Любые предложения / предложения приветствуются!
Вы используете устаревшую версию Eclipse, более раннюю, чем Java 11. Для Java 11 требуется Eclipse 2018-09 плюс подключаемый модуль Поддержка Java 11 для Eclipse 2018-09 (4.9). @nullpointer
@howlge, 4.7.3a - это самая последняя стабильная версия. Я перепроверил здесь: eclipse.org/downloads/packages/release/oxygen. Есть ли другие последние обновления после 4.7.3a?
@nullpointer, файл module-info.java пуст только после объявления модуля. Та же самая оснастка модуля прилагается к вопросу.
В новом выпуске заканчивается обслуживание предыдущего выпуска. За Oxygen последовал Photon, за которым последовал 2018-09 (а Java 11 была выпущена после выпуска 2018-09): eclipse.org/downloads/packages/release
Но модули были введены в Java 9 и с тех пор не менялись (насколько мне известно). Так разве Eclipse не может компилировать module-info.java
?
@nullpointer: об этой проблеме уже сообщалось сообществу Eclipse. Пожалуйста, обратитесь по этой ссылке: bugs.eclipse.org/bugs/show_bug.cgi?id=533390
Я скачал новую версию: 2018-09 (4.9.0). И он отлично работает с JDK 11. Я загрузил «Eclipse IDE для разработчиков Java EE» из местоположения: eclipse.org/downloads/packages/release/2018-09/r. И его рабочий файл с JDK 11. @Howlger: Не могли бы вы упомянуть то же самое в ответе, чтобы я мог отметить эту ветку как Готовую.
@Holger Да, но если уровень соответствия установлен меньше 9, файл module-info.java
компилируется как обычный файл Java, а module
в начале является синтаксической ошибкой согласно JLS.
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?
Думаю, основная проблема - это версия, которая содержится в заголовке каждого файла .class
(номер основной версии: два байта по смещению 6 и 7). К сожалению, версия файла класса Java будет увеличиваться с каждой версией Java, даже если формат файла класса не изменился (насколько мне известно, это было в случае с Java 10 (54) -> 11 (55)). Обратите внимание, что версия файла более высокого класса также может означать, что части не только неизвестны, но и байты должны интерпретироваться по-другому.
Я имею в виду именно эту версию. Минимум, который должен понимать Eclipse, - это 55> 54 (как было сказано в моем предыдущем комментарии, я даже зашел так далеко, чтобы предположить, что вычитание 44
дает нам основную версию, пока ее не отзовут). Поэтому следует понимать, что более новая версия файла классов, чем 53
, допускает уровень соответствия 9
или 10
. Если не удается проанализировать файл класса, это совершенно другая проблема, поскольку уровень соответствия 8
или более ранней версии не решит эту проблему. Сравните с с этой известной проблемой.
@Holger Это будет работать только в том случае, если формат класса был обратно совместим, что по определению не является. Например, если вы проигнорируете номер версии, возможно, файл с версией 60
можно будет прочитать без проблем, но неправильно (поскольку отдельные байты имеют разное значение).
Как указано в связанном ответе, Eclipse - это известен тем, что пытается, несмотря на большее число. Если Eclipse только что сообщил «Неподдерживаемый JDK, номер версии xyz», проблем с этим нет. Но Eclipse этого не делает. Он все еще пытается, а иногда даже работает. Но возвращаться к уровню соответствия до Java 9, потому что номер версии выше 10, просто не имеет никакого смысла. И это не меняет шансов уйти от анализа файлов классов JDK. Файлы классов JDK не изменяются при изменении уровня соответствия проекта.
@Holger «Но Eclipse этого не делает». Вы уверены? Я уже видел такие ошибки. Уровень соответствия устанавливается в диалоговом окне Новый проект Java (по умолчанию предварительно выбрано ранее выбранное значение). Конечно, в Eclipse Oxygen.3a вы можете исправить синтаксическую ошибку в module-info.java
, установив уровень соответствия 9, но это не приведет к исчезновению красного восклицательного знака на проекте и соответствующей ошибки в представлении Проблемы (которое будет показаны из-за неподдерживаемой JRE и не были упомянуты / показаны в вопросе).
Это противоречит вашему ответу «… И поэтому пока не может обнаружить Java 11 JDK / JRE. Обнаружение требуется, чтобы иметь возможность установить уровень соответствия компилятора Java 9 или выше.». Конечно, связанный ответ касается Java 8, и с тех пор все могло измениться. Но эти вопросы и ответы, кажется, согласуются с этим. Для всех остальных функций, например пытаясь использовать лямбда-выражения с уровнем соответствия 7, Eclipse выдаст соответствующее сообщение о том, что это не соответствует уровню соответствия. То же самое и с module-info
. Но если JDK не поддерживается, он должен сказать это громко.
@Holger На самом деле это было неправильно. Спасибо за указание на это. Я обновил ответ.
Вы сообщить об этом затмению? Кроме того, каково содержимое вашего
module-info.java
и где он находится в структуре проекта?