java - Netty- 无法访问类 jdk.internal.misc.Unsafe

标签 java netty java-11

当我将 Java 从 8 升级到 11 时,我从 Netty 收到关于 "jdk.internal.misc.Unsafe" 的错误,详细信息如下:

我知道这是一条调试级别的消息,我可以更改日志级别以忽略它。但是我不确定当我忽略它时是否还会有其他问题——比如性能。有谁知道最好的解决方案?

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/:?]

最佳答案

要允许 netty 访问该类,请使用以下选项启动 java:

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

这会将模块 java.base 中的包 jdk.internal.misc 打开到未命名的模块。

另请参阅 java command 的文档,还有这个 intro to the Java module system一般而言。

编辑:对于 Netty 使用其直接缓冲区优化,您还需要设置

-Dio.netty.tryReflectionSetAccessible=true

关于这个主题有很多 Netty 问题,例如参见netty/issues/7769

关于java - Netty- 无法访问类 jdk.internal.misc.Unsafe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57885828/

相关文章:

使用 Web 服务器作为负载均衡器时的 Java Web session cookie 路径问题

java - J2ME Https 连接不工作

java - netty - 如何将 ChannelBuffer 类型保存到文件中?

java - 无法使用 Maven 编译简单的 Java 10/Java 11 项目

java - 使用 Intellij 想法在 Java 11 上构建 Scala 错误

java - 与使用 ArrayList 插入数据库值相关的 SQLException

Java - 将对象以多态方式传递给接受通用参数的方法

android - Akka Remoting 是否仅支持单向连接?

java - Netty 4 beta1内存消耗

java - 使用 mule 安装 Maven 错误,jdk 中找不到 com.sun.tools.jar