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