现象 java11的本地环境,服务中使用到netty。启动后,服务无法访问,查看日志,有提示: cannot access class jdk.internal.misc.Unsafe ... because the module java.base not export jdk.internal.misc to unnamed module
解决办法 stackoverflow给了原因以及解决办法。
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED -Dio.netty.tryReflectionSetAccessible=true
到了这里就完了。但是为什么呢?他还指出了是java9的module概念。
作为一个刨根问底的程序员,当然要去看看。
Understanding Java 9 Modules 里面介绍了java9的概念,语法。大概一看,就是为了让Java环境更小、强封装等。
环境更小 好理解,只为设备安装需要的module。 强封装是什么东西?
其中语法open提到了,以前反射可以访问各种类、成员变量,不管它是public还是private的。实际上破坏了封装。 现在,只能访问export的模块。
允许runtime期间在目标module访问某个package opens package to comma-separated-list-of-modules
–add-opens等同于open to命令 ```–add-opens module/package=target-module(,target-module)*`` 因此我们的--add-opens java.base/jdk.internal.misc=ALL-UNNAMED 命令就是让无法访问的jdk.internal.misc允许任何未命名的模块访问。
至于tryReflectionSetAccessible 官网说是告诉netty使用反射。
其他的,不看了, 还要加班呢。😕
参考 https://stackoverflow.com/questions/57885828/netty-cannot-access-class-jdk-internal-misc-unsafe https://github.com/netty/netty/issues/7769 https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE https://www.oracle.com/corporate/features/understanding-java-9-modules.html https://segmentfault.com/a/1190000013409571
|