我有一个使用 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/