🙆
google-java-com.sun.tools.javac.parserにアクセスできないエラーが出力する
Java17がリリースされたので反映してspotlessJavaCheckタスクを実行した際に、google-java-formatでcom.sun.tools.javac.parserにアクセス出来ないエラーが出るようになりましたのでその対処法についてのメモです。
JEP 396の影響です。
google-java-format以外でも同様のアクセス出来ないエラーが出力する可能性があります。
出力するエラー
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.
--- 略 ---
Caused by: java.lang.IllegalAccessError: class com.google.googlejavaformat.java.JavaInput (in unnamed module @0xd8e000) 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 @0xd8e000
--- 略 ---
対処方法
プロジェクトのホームディレクトリ(build.gradle)に以下ファイルを追加します。
gradle.properties
org.gradle.jvmargs=--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
これでOKなのですが、google-java-formatが1.9未満
のバージョンの場合には、続けて以下のエラーが出てしまうので、1.10以上に上げてあげればOKです。
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at com.diffplug.spotless.java.GoogleJavaFormatStep$State.lambda$createFormat$1(GoogleJavaFormatStep.java:179)
--- 略 ---
Caused by: java.lang.NoSuchFieldError: reader
--- 略 ---
以下のバージョン指定に1.10.0
以上を指定する。
build.gradle
spotless {
java {
googleJavaFormat('1.10.0')
}
}
Discussion