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

how to package and reference text file in resources folder

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

getClass.getResource("/myFile.txt")

这很好运行使用 sbt 运行 连接源代码。但是我想打包部署到服务器上。

在 build.sbt 中,经过一些谷歌搜索后,我已经可以使用它了

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

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

创建

sbt universal:packageBin

生成的文件夹结构:

target - universal - bin
                   - lib
                   - resources

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

Exception in thread "main" org.apache.spark.sql.AnalysisException: Path does not exist: file:/C:/Software/my-application-0.0.1/lib/my-application-0.0.1.jar!/myFile.txt;

请记住,我在部署基于 scala 或 jvm 的东西方面经验为零,因此您可能不得不给我解释一下


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

这可能有多种原因。

在生成的 jar 中包含文件

你添加的这行不正确

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

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

mappings in Universaldocumentation link) define the content of the created package (with universal:packageBin the zip file). I assume that you are using the JavaAppPackaging plugin,它配置您的整个构建。默认情况下,所有依赖项和您的实际构建工件最终都在 libs 文件夹中。启动脚本被放置在bin.

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

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

如何在类路径中查找文件

您发布了这个片段

 getClass.getResource("/myFile.txt")

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

希望对您有所帮助, 向