如何在资源文件夹中打包和引用文本文件

时间:2018-03-07 12:14:30

标签: scala sbt-native-packager

我有一个使用scala和sbt的spark项目。有一次它引用了我想要打包的文本文件。 这是它在应用程序源中的引用方式:

getClass.getResource("/myFile.txt")

使用sbt run可以很好地运行源代码。但是我希望将它打包并部署到服务器上。

在build.sbt中,经过一些谷歌搜索后,我有了这个工作

import NativePackagerHelper._
mappings in Universal ++= directory("src/main/resources")

添加这意味着myFile.txt出现在包中的resources文件夹中。使用

创建
  

sbt universal:packageBin

生成的文件夹结构:

target - universal - bin
                   - lib
                   - resources

然而,当我从bin / my-application.bat运行我的打包应用程序时,出现以下错误

  

线程“main”中的异常org.apache.spark.sql.AnalysisException:Path不存在:file:/ C:/Software/my-application-0.0.1/lib/my-application-0.0.1。罐子/myFile.txt;!

请记住,我没有部署基于scala或jvm的东西的经验,所以你可能不得不用勺子给我解释

编辑后来我意识到文本文件实际上包含在.jar文件中。 问题是getResource在这种情况下不起作用,我不得不调整我的代码来使用getResourceAsStream

1 个答案:

答案 0 :(得分:2)

这可能有多种原因。

在生成的jar中包含文件

您添加了此行,这是不正确的

import NativePackagerHelper._
mappings in Universal ++= directory("src/main/resources")

src/main/resources目录是resourceDirectory in Compile,内容始终存在于包 jar 文件中(不是zip!)。因此,我强烈建议您删除此代码段,因为您将在类路径中将文件保留两次。

mappings in Universaldocumentation link)定义创建的包的内容(使用universal:packageBin zip文件)。我假设您使用JavaAppPackaging plugin,它配置您的整个构建。默认情况下,所有依赖项和您的实际构建工件最终都在libs文件夹中。启动脚本位于bin

启动脚本还会创建一个有效的类路径,其中包含lib中的所有库,默认情况下不包含任何其他库。

TL; DR 您只需将文件放在src/main/resources中,它们就可以在类路径中使用。

如何在类路径中查找文件

您发布了此代码段

 getClass.getResource("/myFile.txt")

这将在类路径的根中查找名为myFile.txt的文件。如在建议的注释中那样,您应该打开应用程序jar文件并在根目录中找到文本文件myFile.txt,否则将无法找到它。

希望有所帮助, 缪奇