🙆

google-java-com.sun.tools.javac.parserにアクセスできないエラーが出力する

2021/09/20に公開

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')
	}
}

参考

google-java-format->issue:538

Discussion