如何打包和引用资源文件夹中的文本文件
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 Universal
(documentation 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
,否则将找不到。
希望对您有所帮助,
向
我有一个使用 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 Universal
(documentation 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
,否则将找不到。
希望对您有所帮助, 向