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
相关产品推荐
相关产品推荐

