Java10使用時のGradle警告について

Java10がリリースされましたので、
早速インストールしてみました。

Oradleのページから全然問題なくインストールできます。

バージョン確認

$ java -version
java version "10" 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+46)
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (3):
    10, x86_64: "Java SE 10"    /Library/Java/JavaVirtualMachines/jdk-10.jdk/Contents/Home
    9.0.1, x86_64:      "Java SE 9.0.1" /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home
    1.8.0_65, x86_64:   "Java SE 8"     /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk-10.jdk/Contents/Home

java_home コマンドで自身のマシンに
どのバージョンのJavaがインストールされているのか確認する事ができます。

JAVA_HOME環境変数を設定していない場合は、
一番上に表示されているJDKのHOMEが使われているかと思います。

Gradleがバージョンを認識しない

古いGradleを使用していると、下記のようにJava10のバージョンを認識してくれません。
(なんとなく動作はするみたいですが)

Could not determine Java version using executable /Library/Java/JavaVirtualMachines/jdk-10.jdk/Contents/Home/bin/java.
javaのバージョンが確認できませんでした。

※試したのは、Gradle4.3

現時点で最新のGradle4.6あたりを使用すれば、正常に認識するようです。

Gradleで警告がでる

Java10と9から、Gradle使用時に下記のような警告が発生します。
警告が出るだけで、動作は問題ないようです。

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass (file:/Users/tyab/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-all/2.4.14/cd1a8ce914f5fe86c00a917b0577da6f367edcf9/groovy-all-2.4.14.jar) to method java.lang.Object.finalize()
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedClass
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

Gradle使用時のこの警告は、Java9以降で発生します。

Gradleというよりは、GroovySDK側で、non-publicメソッドにアクセスしているという事なんでしょうが、
Groovy側では、現在まだ修正されていないようです。

Groovy の Illegal reflective access は修正されたのか?

--add-opensオプション

Gradle起動時に警告メッセージが出ているようなので、jvmオプションに以下を追加するとよいみたい。

--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED

JAVA_TOOL_OPTIONS環境変数を使って、gradleを使う例

JAVA_TOOL_OPTIONS="--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED" ./gradlew --no-daemon -v

bashrcへの追記

毎回指定するのが面倒なら、bashrcなどに追記しておくとよいが。
Groovy側で動きがあれば解消する問題かと思うので、きっと今だけな気がする。

# .bashrcへ追記
echo '
export JAVA_TOOL_OPTIONS="--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED"
' >> ~/.bashrc

# .zshrcへ追記
echo '
export JAVA_TOOL_OPTIONS="--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED"
' >> ~/.zshrc

参考URL

gradle issue
https://github.com/gradle/gradle/issues/2995

groovy apache
https://issues.apache.org/jira/browse/GROOVY-8339

--add-opens
https://stackoverflow.com/questions/41265266/how-to-solve-inaccessibleobjectexception-unable-to-make-member-accessible-m

1件のコメント

コメントを残す