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

标签 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 出现在包的资源文件夹中。使用

创建

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 的东西方面经验为零,因此您可能不得不向我灌输解释


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

最佳答案

这可能有多种原因。

在生成的 jar 中包含文件

你添加了这一行,这是不正确的

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

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

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

启动脚本还会创建一个有效的类路径,默认情况下它包括 lib 中的所有库,除此之外什么都没有。

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

如何在类路径中查找文件

你发布了这个片段

 getClass.getResource("/myFile.txt")

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

希望对你有帮助, 木木

关于scala - 如何打包和引用资源文件夹中的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49151713/

相关文章:

xml - 适用于 2.10+ 的 Scala XML 库

scala - 如何使用 LabelledGeneric 一般更新案例类字段?

scala - 使用sbt-native-packager构建docker软件包时出现重复映射

sbt - 如何使用 sbt-assembly 和 sbt-native-packager 构建 deb 包以包含单个程序集 jar?

Scala 构造函数重载?

scala - Binding.scala:定义变量长度的策略

scala - 使用Spark结构化流处理包含嵌套实体的JSON

playframework - 使用 sbt native 打包程序的特定于环境的发行版

scala - 为什么sbt-native-packager将bin/start登台为目录而不是脚本?

sbt-native-packager - 为什么发布时版本在工件名称中出现两次?