Windows环境运行Apache Arrow Java代码抛出初始化异常如何解决
你遇到的一连串报错核心触发点是JDK模块访问权限限制:
JDK 9及以上版本引入了模块化系统,默认禁止未命名模块反射访问java.base模块下java.nio包的内部字段,直接导致Arrow的MemoryUtil类初始化失败。后续抛出的Writer空指针、内存泄漏异常都是初始化流程中断触发的连带错误,和你写的ListVector写入逻辑没有关系。
- 执行
java -version确认当前运行环境的JDK版本,若版本号≥9,即可确认命中模块权限限制问题 - 核对pom中所有Arrow依赖的版本,若版本低于15.0.0,对JDK17及以上版本的适配存在已知缺陷,会大幅提高这类反射报错的概率
按优先级从高到低选择即可:
方案1:添加JVM启动参数(最快生效,兼容所有Arrow版本)
在IDE运行配置、或者项目启动命令中追加以下JVM参数,开放对应模块的反射访问权限:
--add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED -Dio.netty.tryReflectionSetAccessible=true
如果使用IntelliJ IDEA,直接在Run/Debug Configurations面板的VM options栏填入上述参数,重启运行即可。
方案2:升级Arrow版本
将${arrow.version}升级到15.0.0及以上的稳定正式版,新版Arrow已经完成JDK9+模块化系统的适配,不需要额外添加启动参数即可正常完成内存模块初始化,同时修复了旧版本中初始化中断触发的空指针、资源释放失败问题。
升级时必须保证arrow-vector、arrow-memory-core、arrow-memory-netty三个Arrow相关依赖的版本完全一致,版本混装会触发类不兼容报错。
方案3:回退JDK版本到1.8
如果项目没有高版本JDK的强制要求,可以直接切换运行环境到JDK8,该版本没有模块化访问限制,Arrow所有版本对JDK8的兼容性最稳定,不需要额外配置即可直接运行示例代码。
根因解决后,你贴的示例代码不需要做业务逻辑修改即可正常运行。之前抛出的内存泄漏报错,是try-with-resources触发资源回收时,内存模块未完成初始化导致回收流程中断产生的误报,不是代码本身存在内存泄漏问题,根因修复后该报错会自动消失。
内容的提问来源于stack exchange,提问作者Brijesh

