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