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
    
posted @ 2024-12-08 01:35  INnoVation-V2  阅读(252)  评论(0)    收藏  举报