Guice:module java.base does not “opens java.lang” to module com.google.guice
問題
Guice 4.2.2で以下のエラーが発生。AdoptOpenJDK12上だ。
もちろんこれは、Java9モジュールシステムの制限をGuiceが越えようとしているからだ。簡単な方策としては、モジュールの使用をやめることなのだが。。。
com.google.common.util.concurrent.UncheckedExecutionException: java.lang.IllegalStateException: Unable to load cache item
at com.google.common@25.1-android/com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2048)
at com.google.common@25.1-android/com.google.common.cache.LocalCache.get(LocalCache.java:3850)
at com.google.common@25.1-android/com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3874)
(略)
java.lang.IllegalStateException: Unable to load cache item
at com.google.guice@4.2.2/com.google.inject.internal.cglib.core.internal.$LoadingCache.createEntry(LoadingCache.java:79)
at com.google.guice@4.2.2/com.google.inject.internal.cglib.core.internal.$LoadingCache.get(LoadingCache.java:34)
at com.google.guice@4.2.2/com.google.inject.internal.cglib.core.$AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116)
(略)
Caused by:
java.lang.ExceptionInInitializerError
at com.google.guice@4.2.2/com.google.inject.internal.cglib.core.$DuplicatesPredicate.evaluate(DuplicatesPredicate.java:104)
at com.google.guice@4.2.2/com.google.inject.internal.cglib.core.$CollectionUtils.filter(CollectionUtils.java:52)
(略)
Caused by:
com.google.inject.internal.cglib.core.$CodeGenerationException: java.lang.reflect.InaccessibleObjectException-->Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to module com.google.guice
at com.google.guice@4.2.2/com.google.inject.internal.cglib.core.$ReflectUtils.defineClass(ReflectUtils.java:464)
at com.google.guice@4.2.2/com.google.inject.internal.cglib.core.$AbstractClassGenerator.generate(AbstractClassGenerator.java:336)
at com.google.guice@4.2.2/com.google.inject.internal.cglib.core.$AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93)
(略)
Caused by:
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to module com.google.guice
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:341)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:281)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:198)
(略)
at org.eclipse.jetty.server.Server.doStart(Server.java:382)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at foo.bar.webServer/jettyTest.JettyStart.main(JettyStart.java:32)
解決
Java 9 (JDK-9) support for guice #1085に議論がある。
いったんは解決したようだが、またもJava10かJava11あたりでぶり返したようだ。簡単な解決策としてはVM引数に以下をつける。
--add-opens java.base/java.lang=com.google.guice