IntelliJ运行Scala Spark单元测试遇InaccessibleObjectException问题
解决Spark单元测试中
InaccessibleObjectException: Unable to make private java.nio.DirectByteBuffer(long,int) accessible问题 这个错误本质是JDK模块系统限制了反射访问私有构造方法,虽然你已经用了兼容的JDK版本,但单元测试的运行环境和直接运行类的环境存在差异,试试以下方案:
添加JVM反射权限参数
单元测试的JVM参数可能没开放必要的模块访问权限,需要给测试进程添加:--add-opens java.base/java.nio=ALL-UNNAMED在IntelliJ中操作:打开
Run/Debug Configurations,找到你的测试配置,在VM options栏填入上述参数。如果用构建工具(sbt/maven),也要同步配置测试的JVM参数,比如sbt在build.sbt中添加:javaOptions in Test += "--add-opens java.base/java.nio=ALL-UNNAMED"调整测试类加载器
单元测试默认的类加载器可能导致模块权限不生效,在IntelliJ的测试配置中,切换到Configuration标签页,找到Classloader选项,选择Application classloader替代默认的测试类加载器,再重新运行测试。确认Spark与JDK版本的适配细节
不同Spark版本对JDK11的支持有差异,比如Spark 3.0+正式支持JDK11,但部分早期3.x版本可能需要额外参数。如果你的Spark版本偏旧,建议切换回JDK8测试,或者升级到对应JDK11兼容的Spark版本。清理项目缓存并重建
执行IntelliJ的Build -> Clean Project,再选择Rebuild Project,清除可能存在的缓存配置冲突,之后重新运行测试。
内容的提问来源于stack exchange,提问作者menrric
相关产品推荐
相关产品推荐

