Spark 問題集

INnoVation-V2發表於2024-12-08

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
    

相關文章