环境:
windows
IntelliJ IDEA 2023.1.1 (Ultimate Edition)
jdk 17
flink-runtime_2.11_1.11.2
具体报错信息如下:
java.lang.IllegalAccessError: class org.apache.flink.util.NetUtils (in unnamed module @0x1a407d53) cannot access class sun.net.util.IPAddressUtil (in module java.base) because module java.base does not export sun.net.util to unnamed module @0x1a407d53
at org.apache.flink.util.NetUtils.unresolvedHostToNormalizedString(NetUtils.java:167)
at org.apache.flink.runtime.akka.AkkaUtils$.getRemoteAkkaConfig(AkkaUtils.scala:422)
at org.apache.flink.runtime.akka.AkkaUtils$.getAkkaConfig(AkkaUtils.scala:233)
at org.apache.flink.runtime.akka.AkkaUtils$.getAkkaConfig(AkkaUtils.scala:191)
at org.apache.flink.runtime.akka.AkkaUtils$.getDefaultAkkaConfig(AkkaUtils.scala:252)
at org.apache.flink.runtime.akka.AkkaUtils$.createDefaultActorSystem(AkkaUtils.scala:135)
at org.apache.flink.runtime.akka.AkkaUtils.createDefaultActorSystem(AkkaUtils.scala)
百度了下:
AI直接给出的答案居然比正常搜索的候选更靠谱:
这个错误表明在Java 9及以上版本中,模块系统不允许未命名模块(在这里是@0x1a407d53代表的模块,即加载的某个类或资源的内部表示)访问java.base模块中的sun.net.util包。sun.net.util是内部API,不应该在应用程序中直接使用,因为它可能在不同版本的JDK中变化,并且不保证向后兼容。
解决方法:
不要使用sun.*或com.sun.*API,改用官方公开的API。对于sun.net.util,你可以考虑使用java.net包中的公共类。
如果你需要使用该包中的类,并且你确定不会有兼容性问题,可以尝试添加--add-exports JVM参数来允许未命名模块访问这个包。例如,在运行Java应用程序时,可以在命令行中添加以下参数:
--add-exports=java.base/sun.net.util=ALL-UNNAMED
请注意,这种方法违反了Java模块化系统的原则,可能会导致将来在更新Java版本时出现问题。因此,除非绝对必要,否则不推荐使用。
根据提示,在idea的类运行配置中添加如下的VM 参数:
--add-exports=java.base/sun.net.util=ALL-UNNAMED
由于我的默认有VM参数,最终的VM参数如下:
-ea --add-exports=java.base/sun.net.util=ALL-UNNAMED
再次运行正常了。
jdk高版本unnamed问题总结: