Spark 问题集
1. 包无法访问
-
错误信息
java.lang.IllegalAccessError: class org.apache.spark.storage.StorageUtils$ (in unnamed module @0x2aceadd4) cannot access class sun.nio.ch.DirectBuffer (in module java.base) because module java.base does not export sun.nio.ch to unnamed module @0x2aceadd4
-
翻译:
Spark的StorageUtils方法无法访问java.base模块中的sun.nio.ch.DirectBuffer,因为java.base模块中的sun.nio.ch未导出到unnamed module
-
背景介绍
Java 9之前,JDK的所有类和包都位于一个巨大的类路径中,可以通过路径随意访问任何一个类,出于安全性等的考虑,推出了模块功能
每个模块有明确的定义,描述模块中的包哪些是公开的,哪些是仅供内部使用的。
-
出错原因
以上面的为例,就是java.base模块中的sun.nio.ch是私有类,无法被外部类访问
-
解决方法
将这些类从模块中导出到未命名模块(unnamed module),未命名模块是一个特殊的模块,其中的类可通过路径被任何人访问
VM Options添加如下参数进行导出
--add-opens=java.base/sun.nio.ch=ALL-UNNAMED
如果继续报相似错误,以此类推继续添加即可,比如
--add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED