Java连接Snowflake JDBC执行查询时的--add-opens模块报错问题求助
Java连接Snowflake JDBC执行查询时的--add-opens模块报错问题求助
嘿,我来帮你捋捋这个让人头大的问题!
首先你遇到的Unknown module: org.apache.arrow.memory.core报错,核心原因其实很简单:你用的Arrow Memory Core 18.3.0版本根本不是模块化JAR(也就是包里没有module-info.java),JDK的模块系统根本识别不到这个所谓的org.apache.arrow.memory.core模块名,自然会报错说找不到。
给你几个具体的解决步骤,按顺序试:
- 第一步:直接删掉针对
org.apache.arrow.memory.core的配置,只保留--add-opens=java.base/java.nio=ALL-UNNAMED这个VM参数就行。因为非模块化的JAR都会被JDK归到ALL-UNNAMED这个匿名模块里,不需要指定具体的模块名,直接给匿名模块开权限就够了。 - 第二步:在Eclipse里确保VM参数配置正确:
- 右键你的项目 → Run As → Run Configurations
- 找到你的Java程序配置项,切到Arguments标签页
- 在VM Arguments输入框里只填
--add-opens=java.base/java.nio=ALL-UNNAMED,别加多余的内容
- 第三步:检查依赖版本兼容性:Snowflake JDBC 3.24.2配套的Arrow版本应该是17.x系列,你直接用了18.3.0,版本差得有点多,很容易出问题。建议换成和JDBC版本匹配的Arrow包,或者更省心的是直接用Snowflake JDBC的“胖包”(如果有的话),它会自带所有兼容的依赖,不用你自己手动加Arrow和JNA。
- 第四步:试试降级JDK版本。JDK24是非常新的版本,Snowflake JDBC对它的适配可能还没跟上,毕竟LTS版本才是企业级应用的主流。换成JDK17或者JDK21,模块系统的兼容性问题会少很多。
另外你提到Arrow jar里看不到“core”模块,这完全正常,因为18.x的arrow-memory-core是传统的非模块化JAR,没有module-info.java,所以JDK不会把它识别为一个命名模块,这也是为什么你指定模块名会报错的根本原因。
按上面的步骤调整后,应该就能解决这个报错了,先从第一步的参数调整开始试,这是最直接的解决方案!
内容来源于stack exchange
相关产品推荐
相关产品推荐

