我有一个使用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
答案 0 :(得分:2)
这可能有多种原因。
您添加了此行,这是不正确的
import NativePackagerHelper._
mappings in Universal ++= directory("src/main/resources")
src/main/resources
目录是resourceDirectory in Compile
,内容始终存在于包 jar 文件中(不是zip!)。因此,我强烈建议您删除此代码段,因为您将在类路径中将文件保留两次。
mappings in 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
,否则将无法找到它。
希望有所帮助, 缪奇