Плагин Eclipse - добавить-экспорт Java 16+

Использование плагина eclipse в формате google-java отлично работает при запуске Eclipse под Java 11, но при запуске на Java 16+ он не работает со следующей ошибкой:

Полная ошибка: A save participant caused problems. The save participant 'Code Clean Up' caused an exception: java.lang.IllegalAccessError: class com.google.googlejavaformat.java.JavaInput (in unnamed module @0x99c5646) cannot access class com.sun.tools.javac.parser.Tokens$TokenKind (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.parser to unnamed module @0x99c5646. See the error log for details.

Google-java-formatter отмечает, что при работе с JDK 16+ вам необходимо установить флаг при запуске форматировщика из-за JEP-396 (сильная инкапсуляция внутренних компонентов JDK). Что не ясно, так это как определить набор --add-exports для плагинов Eclipse.

Добавление следующего в eclipse.ini (или в моем случае SpringToolSuite4.ini), похоже, не помогает (не говоря уже о том, что это неправильно, поскольку он не нацелен на этот конкретный плагин). Есть ли другой способ подойти / исправить это?

      -vmargs
-Dosgi.requiredJavaVersion=11
-Dosgi.dataAreaRequiresExplicitInit=true
-Xms256m
-Xmx2048m
--illegal-access=permit
--add-modules=ALL-SYSTEM
--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED

2 ответа

Как сказал xDeyan выше, ваш файл eclipse.ini должен иметь следующие строки после строки -vmargs.

      --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED

Это было протестировано и работает с JDK17.

Для тех, у кого все еще есть эта проблема, работающая на JDK 17, просто добавьте =между --add-exportsвот так:

      --add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
Другие вопросы по тегам