环境:
windows
IntelliJ IDEA 2023.1.1 (Ultimate Edition)
jdk 17
flink-runtime_2.11_1.11.2
具体报错信息如下:
Exception in thread "main" java.lang.reflect.InaccessibleObjectException: Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not "opens java.lang" to unnamed module @1810399e
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:104)
at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:126)
at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:71)
at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.clean(StreamExecutionEnvironment.java:1899)
at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.addSource(StreamExecutionEnvironment.java:1612)
at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.addSource(StreamExecutionEnvironment.java:1569)
at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.socketTextStream(StreamExecutionEnvironment.java:1373)
at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.socketTextStream(StreamExecutionEnvironment.java:1413)
at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.socketTextStream(StreamExecutionEnvironment.java:1430)
at org.apache.flink.streaming.api.scala.StreamExecutionEnvironment.socketTextStream(StreamExecutionEnvironment.scala:616)
at OrderedStreamWaterMark$.main(OrderedStreamWaterMark.scala:25)
at OrderedStreamWaterMark.main(OrderedStreamWaterMark.scala)
参考百度AI信息:
这个错误信息表明在Java 9及以上版本中,一个模块(在这个例子中是未命名模块,由@643b1d11标识)尝试打开java.lang包,这是java.base模块的一部分,但这种操作是被禁止的,因为java.lang是一个核心模块,不应该被打开给其他模块使用。
注意这里错误信息中的关键字【opens 】
对应的解决方案还是添加相应的VM启动参数
--add-opens java.base/java.lang=ALL-UNNAMED
这里稍微总结下JDK高版本中的unnamed问题
常见的unamed问题通常有两种:opens 和exports
exports问题参考:
针对不同的问题,添加相应的VM启动参数即可。
常用的参数如下:
--add-exports=java.base/sun.net.util=ALL-UNNAMED
--add-exports=java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/sun.net.util=ALL-UNNAMED
根据需要添加即可。