cannot access class sun.nio.ch.DirectBuffer (in module java.base) because module java.base does not
cannot access class sun.nio.ch.DirectBuffer (in module java.base) because module java.base does not
我在本地IDEA编写java spark时遇到以下报错信息:
Exception in thread "main" java.lang.IllegalAccessError: class org.apache.spark.storage.StorageUtils$ (in unnamed module @0x37f1104d) cannot access class sun.nio.ch.DirectBuffer (in module java.base) because module java.base does not export sun.nio.ch to unnamed module @0x37f1104d
at org.apache.spark.storage.StorageUtils$.<clinit>(StorageUtils.scala:213)
at org.apache.spark.storage.BlockManagerMasterEndpoint.<init>(BlockManagerMasterEndpoint.scala:121)
at org.apache.spark.SparkEnv$.$anonfun$create$9(SparkEnv.scala:358)
at org.apache.spark.SparkEnv$.registerOrLookupEndpoint$1(SparkEnv.scala:295)
at org.apache.spark.SparkEnv$.create(SparkEnv.scala:344)
at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:196)
at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:284)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:483)
at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58)
at org.example.spark01_read_memeroy.main(spark01_read_memeroy.java:16)
其中spark-core为3.5.0,而java版本为18,错误信息简单翻译一下是因为 class org.apache.spark.storage.StorageUtils不能访问class sun.nio.ch.DirectBuffer(在模块java.base中),因为模块java.base没有将 sun.nio.ch
包导出给你正在使用的未命名模块 (unnamed module @0x37f1104d
)。
什么是模块java.base?
这是 Java 的基础模块,包含所有 Java 核心类,默认所有 Java 程序都会依赖这个模块。
为什么不能将 sun.nio.ch
包导出使用?
因为在 Java 9 及更高版本中,Java 引入了模块系统,限制了对某些内部 API(如 sun.nio.ch
)的访问,而sun.nio.ch
包包含 Java 的内部 I/O 实现和底层网络处理代码,属于 JDK 内部 API,不在公共 API 范围内。此包仅供 Java 内部使用,不允许外部代码直接访问。
总的来说sun.nio.ch
是 Java 内部的一个包,Java 18 以上版本对其访问权限做了限制,默认情况下外部代码(包括 Spark)无法访问这个包中的类
怎么解决?
添加VM options:
--add-exports java.base/sun.nio.ch=ALL-UNNAMED
作用是将 java.base
模块中的 sun.nio.ch
包“导出”到未命名模块,
更多推荐
所有评论(0)