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

Scala 如何打包和引用资源文件夹中的文本文件,scala,sbt-native-packager,Scala,Sbt Native Packager,我有一个使用scala和sbt的spark项目。在某一点上,它引用了我想要打包的文本文件。 这是在应用程序源中引用它的方式: getClass.getResource("/myFile.txt") 使用sbt run运行源代码可以很好地工作。但我希望将其打包并部署到服务器 在build.sbt中,经过一些谷歌搜索之后,我已经让它工作了 import NativePackagerHelper._ mappings in Universal ++= directory("src/main/reso

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

getClass.getResource("/myFile.txt")
使用sbt run运行源代码可以很好地工作。但我希望将其打包并部署到服务器

在build.sbt中,经过一些谷歌搜索之后,我已经让它工作了

import NativePackagerHelper._
mappings in Universal ++= directory("src/main/resources")
添加这意味着myFile.txt将显示在包的resources文件夹中。使用创建

sbt通用:包装箱

生成的文件夹结构:

target - universal - bin
                   - lib
                   - resources
但是,当我从bin/my-application.bat运行打包的应用程序时,会出现以下错误

线程“main”org.apache.spark.sql.analysis异常:路径不存在:文件:/C:/Software/my-application-0.0.1/lib/my-application-0.0.1.jar/myFile.txt

请记住,我没有部署scala或基于jvm的东西的经验,因此您可能不得不向我解释


编辑我后来意识到文本文件实际上包含在.jar文件中。
当时的问题是getResource在这种情况下不起作用,我必须调整代码以使用getResourceAsStream,这可能有多种原因

在结果jar中包含文件 您添加了这一行,这是不正确的

import NativePackagerHelper._
mappings in Universal ++= directory("src/main/resources")
src/main/resources
目录是Compile中的
resource目录,内容始终存在于包jar文件中(而不是zip!)。因此,我强烈建议删除此代码段,因为您的类路径中将有两次文件

Universal
()中的
映射定义了所创建包的内容(使用zip文件
Universal:packageBin
)。我假设您正在使用配置整个构建的。默认情况下,所有依赖项和您的实际构建工件都位于
libs
文件夹中。正在将启动脚本放入
bin

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

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

如何在类路径上查找文件 你发布了这个片段

 getClass.getResource("/myFile.txt")
这将在类路径的根目录中查找名为
myFile.txt
的文件。正如在评论中建议的那样,您应该打开应用程序jar文件,在根目录下找到一个文本文件
myFile.txt
,否则将找不到它

希望有帮助,
Muki

您是否在jar文件(打包到目标目录下后创建的jar)中获得了资源中的任何内容?在构建jar后的系统中(目标中的SBT jar),尝试使用winzip解压它,并尝试在不编译的情况下查找资源文件夹中存在的任何内容。您的文件应该存在于jar文件(您正在运行的SBT jar)类路径中。