Netty- cannot access class jdk.internal.misc.Unsafe

oarsmanli picture oarsmanli · Sep 11, 2019 · Viewed 13.4k times · Source

When I upgraded the Java from 8 to 11, I got an error from Netty about the "jdk.internal.misc.Unsafe", the details are below:

I knew it is a debug level message, and I can change the level of the log to ignore it. But I'm not sure if there would be other problems - such as performance - when I ignore it. Does anyone know the best solution to this?

java.lang.IllegalAccessException: class io.netty.util.internal.PlatformDependent0$6 cannot access class jdk.internal.misc.Unsafe (in module java.base) because module java.base does not export jdk.internal.misc to unnamed module @84b8f0f
    at jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361) ~[?:?]
    at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:558) ~[?:?]
    at io.netty.util.internal.PlatformDependent0$6.run(PlatformDependent0.java:334) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
    at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
    at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:325) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:214) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:82) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.buffer.UnpooledByteBufAllocator.<clinit>(UnpooledByteBufAllocator.java:37) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.buffer.Unpooled.<clinit>(Unpooled.java:73) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
    at wedo.stream3.framework.base.connector.supplier.DelimiterDecoderSupplier.getDelimiter(DelimiterDecoderSupplier.java:41) ~[classes/:?]
    at wedo.stream3.framework.base.connector.supplier.DelimiterDecoderSupplier.<init>(DelimiterDecoderSupplier.java:26) ~[classes/:?]
    at wedo.stream3.framework.base.connector.supplier.DelimiterDecoderSupplier.<init>(DelimiterDecoderSupplier.java:20) ~[classes/:?]
    at wedo.stream3.framework.base.connector.supplier.CommonChannelHandlerSupplier.<init>(CommonChannelHandlerSupplier.java:37) ~[classes/:?]
    at wedo.stream3.framework.base.connector.supplier.CommonChannelHandlerSupplier.<init>(CommonChannelHandlerSupplier.java:25) ~[classes/:?]
    at wedo.stream3.framework.base.connector.TcpClientConnector.start(TcpClientConnector.java:39) ~[classes/:?]
    at wedo.stream3.framework.bootstrap.FrameworkLauncher.lambda$start$0(FrameworkLauncher.java:61) ~[classes/:?]
    at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) [?:?]
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) [?:?]
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1654) [?:?]
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) [?:?]
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) [?:?]
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) [?:?]
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) [?:?]
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) [?:?]
    at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497) [?:?]
    at wedo.stream3.framework.bootstrap.FrameworkLauncher.start(FrameworkLauncher.java:58) [classes/:?]
    at org.stream3.prototype.mfc.App.launchFramework(App.java:58) [classes/:?]
    at org.stream3.prototype.mfc.App.main(App.java:41) [classes/:?]

Answer

gjoranv picture gjoranv · Sep 11, 2019

To allow netty to access the class, start java with the following option:

--add-opens java.base/jdk.internal.misc=ALL-UNNAMED

This opens the package jdk.internal.misc in module java.base to the unamed module.

See also the documentation for the java command, and this intro to the Java module system in general.

EDIT: For Netty to use its direct buffer optimizations, you also need to set

-Dio.netty.tryReflectionSetAccessible=true

There are a number of Netty issues on this subject, see e.g. netty/issues/7769