【问题标题】:Getting nullpointerexception while reading file from resource folder从资源文件夹读取文件时出现空指针异常
【发布时间】:2019-03-26 13:04:09
【问题描述】:

当我尝试读取存在于src/main/resources 位置的文件时,我收到了NullpointerException。当我以jar 格式运行时会发生这种情况。但是当我编译代码并运行它时,它在Intellij 中运行良好。

注意:我正在使用 sbt 包来构建 jar 并运行它。

请帮忙。谢谢!

【问题讨论】:

  • 发布您的代码。否则,我们只是猜测程序可能在做什么。
  • configFileName = CustomParams.dbName + "_" + CustomParams.tableName + "_config.conf" println("configFileName "+configFileName) //检查资源并获取它的路径 //println( "ssdfs " +Thread.currentThread.getContextClassLoader.getResource(s"/$configFileName").getFile) val filePath = DqDriver.getClass.getClassLoader.getResource(s"$configFileName").getFile
  • 请编辑您的问题以包含代码。
  • 感谢您的宝贵时间。我从另一个建议中得到了解决方案!

标签: scala intellij-idea jar sbt intellij-14


【解决方案1】:

已打包到 JAR 中的文件不再可从文件系统访问。这可以在查看从myClass.getResource("file.txt") 返回的URL 时看到,例如:

/home/sria/cde-spark-assembly-1.0.jar!/file.txt

注意!,表示该文件已打包到JAR 中。


这意味着您必须始终使用以下模式访问资源文件:

对于src/main/resources/file.txt中的文件:

myClass.getResourceAsStream("file.txt")

您可能不想这样做的原因有两个:

  1. 将文件添加到资源目录会增加 JAR 文件的大小。
  2. 无法使用标准文件系统操作访问该文件。

作为替代方案,您可以从文件系统中的(可配置的)路径加载文件,例如:

val inputStream = new BufferedInputStream(new FileInputStream(myPath))

(reference)

这样你可以加载一个文件,例如相对于JAR file pathexecution directory


我希望这会有所帮助。

注意:sbt packagesbt assembly 都会将资源文件打包到 JAR 中。

【讨论】:

  • 我也试过用程序集运行。我得到这样的路径 /home/sria/cde-spark-assembly-1.0.jar!/config.conf 。不知从何而来的感叹号。
  • @A srinivas 是正确的。此路径表示给定文件已打包到 JAR 中。它不能被视为普通文件,应使用getResourceAsStream 检索。
  • 谢谢..它现在工作正常。但是你知道胖罐的替代品吗,因为每次都将胖罐从本地传输到远程是无效的?
  • @Asrinivas 我相应地调整了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 2015-04-01
  • 1970-01-01
相关资源
最近更新 更多