Eclipse中Java开发Flink调用print()报InaccessibleObjectException异常
问题描述
在Eclipse中运行基础Flink程序时,通过datastream_name.print()调用.print()方法打印DataStream数据流时触发报错。
当前声明使用Java 8版本
报错信息如下:
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 @776aec5c 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:180) at java.base/java.lang.reflect.Field.setAccessible(Field.java:174) at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:106) at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:132) at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:132) at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:69) at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.clean(StreamExecutionEnvironment.java:2139) at org.apache.flink.streaming.api.datastream.DataStream.clean(DataStream.java:203) at org.apache.flink.streaming.api.datastream.DataStream.addSink(DataStream.java:1243) at org.apache.flink.streaming.api.datastream.DataStream.writeUsingOutputFormat(DataStream.java:1144) at org.apache.flink.streaming.api.datastream.DataStream.writeAsText(DataStream.java:1004) at orgname.testProjectFlink.App.main(App.java:19)
故障原因
该报错是Java 9及以上版本的模块化系统限制导致:高版本JDK默认禁止未命名模块通过反射访问java.base模块下核心类的私有字段,而Flink的闭包清理逻辑需要通过反射访问java.lang.String的内部字段。出现该矛盾说明Eclipse实际运行程序时使用的JDK版本并非配置的Java 8,而是Java 9/11/17等高版本。
解决方法
- 优先切换运行时JDK为Java 8:打开Eclipse的运行配置,找到当前Flink程序对应的启动项,在JRE选项卡中选中本地安装的JDK 1.8版本,保存配置后重新运行程序即可。
- 若必须使用高版本JDK运行,在运行配置的VM启动参数中添加如下配置,放开对应模块的反射访问权限:
--add-opens java.base/java.lang=ALL-UNNAMED
保存配置后重新启动程序即可解决报错。
内容的提问来源于stack exchange,提问作者Sakshi Bhatia
相关产品推荐
相关产品推荐

