You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

scalac编译生成的jar包无法添加资源,读取resource下SQL文件报空指针异常

问题解决方案

根本原因

你遇到的NullPointerException核心原因是getClass.getClassLoader.getResourceAsStream("query.sql")返回了null值:运行时类路径下找不到query.sql文件,null值传入Source.fromInputStream后,后续调用mkString就会抛出空指针异常。

修复步骤

方案1:将资源文件打入jar包(推荐)

你当前的scalac命令仅编译了Scala代码,不会自动将resources目录下的文件打包到生成的main.jar中,需要手动更新jar包添加资源:

# 原有编译逻辑
scalac -cp "<path-to-resources>/*:<jars path>/*" -d "main.jar" main.scala
# 进入resources目录,将query.sql添加到jar包根路径
cd <替换为你的resources目录实际路径>
jar uf ../main.jar query.sql
cd ..

方案2:运行时添加resources目录到类路径

如果不需要把资源打进jar,可以在提交Spark任务时将resources目录加入驱动类路径:

spark-submit \
  --class <替换为你的主类全限定名> \
  --jars <替换为你的依赖jar路径> \
  --driver-class-path <替换为你的resources目录实际路径> \
  main.jar

代码优化建议

添加空校验避免无意义的空指针异常,提前定位资源缺失问题:

val resourceStream = getClass.getClassLoader.getResourceAsStream("query.sql")
// 资源不存在时提前抛出明确的错误提示
require(resourceStream != null, "资源文件query.sql不存在,请检查打包配置或类路径设置")
val queryIt = scala.io.Source.fromInputStream(resourceStream)
val query = try queryIt.mkString finally queryIt.close()

注意事项

  • 如果使用getClass.getResourceAsStream(而非ClassLoader的getResourceAsStream)读取资源,路径需要添加/前缀:getClass.getResourceAsStream("/query.sql"),否则会从当前类的包路径下查找资源,大概率会查询失败。
  • 确保运行程序的账号对query.sql文件有可读权限。

内容的提问来源于stack exchange,提问作者Niccko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:06:03