【问题标题】:how to package and reference text file in resources folder如何打包和引用资源文件夹中的文本文件
【发布时间】:2018-08-15 13:02:24
【问题描述】:

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

getClass.getResource("/myFile.txt")

这很好用 sbt run 运行源代码。但我希望它被打包并部署到服务器上。

在 build.sbt 中,经过一番谷歌搜索后,我得到了这个工作

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

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

创建

sbt 通用:packageBin

生成的文件夹结构:

target - universal - bin
                   - lib
                   - resources

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

线程“主”org.apache.spark.sql.AnalysisException 中的异常:路径不存在:文件:/C:/Software/my-application-0.0.1/lib/my-application-0.0.1。 jar!/myFile.txt;

请记住,我对部署基于 scala 或 jvm 的东西的经验为零,因此您可能不得不向我提供解释


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

【问题讨论】:

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

标签: scala sbt-native-packager


【解决方案1】:

这可能有多种原因。

在生成的 jar 中包含文件

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

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

src/main/resources 目录是resourceDirectory in Compile,其内容始终存在于包 jar 文件中(不是 zip!)。因此,我强烈建议您删除此 sn-p,因为您的类路径中会包含两次文件。

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

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

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

如何在类路径中查找文件

你发布了这个sn-p

 getClass.getResource("/myFile.txt")

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

希望有帮助, 渚

【讨论】:

    猜你喜欢
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多