scala - 如何从 sbt/apache flink 项目的资源文件夹中打开文件
问题描述
我正在使用apache flink开发一个基于 scala 的项目,到目前为止,我只从 inside 运行我的项目IntelliJ
,它没有问题。现在我是第一次创建一个 JAR 文件,然后由apache flink运行时执行,我遇到了打开资源文件的问题。
setup.xml
启动时,将打开一个从内部命名的文件src/main/resources
。这适用于IntelliJ
,但不适用于 flink 运行时。
在IntelliJ
中,文件夹结构如下:
root
\
src
\
main
\
resources
\
setup.xml
当使用归档浏览器查看创建的 JAR 文件时,结构将如下所示:
root
\
[...]
\
setup.xml
我尝试过的代码变体:
// by path
val filePath = getClass.getResource("/setup.xml").getPath
val currentPath = Paths.get(filePath)
val parsed = XML.loadFile(currentPath.toString)
// by URI
val filePath = getClass.getResource("/setup.xml").toURI
val currentPath = Paths.get(filePath)
val parsed = XML.loadFile(currentPath.toString)
// with classloader
val filePath = getClass.getClassLoader.getResource("setup.xml").toURI
val currentPath = Paths.get(filePath)
val parsed = XML.loadFile(currentPath.toString)
所有 3 个变体都适用于 . IntelliJ
,但不适用于 flink 运行时。它会给java.nio.file.FileSystemNotFoundException
或java.io.FileNotFoundException
。
请注意,以下内容适用于IntelliJ
AND flink 运行时:
val source = Source.fromURL(getClass.getResource("/setup.xml"))
val parsed = XML.loadString(source.getLines().mkString)
但是,我必须能够访问路径组件,并使用组合/解析路径。这是因为 XML 文件将包含指向其他文件的链接,这些文件相对于setup.xml
文件本身存储。因此,我需要获取 的文件路径setup.xml
,并使用此文件路径解析some-referenced.xml
以打开它。
那么我如何在开始使用Path
该类时正确使用这 3 个变体之一,以便我可以在 flink 运行时和 flink 运行时中动态解析其他文件路径IntelliJ
?
解决方案
这是读取我在以前的项目中使用的 CSV 文件的示例:
private val irisDS = env.readCsvFile[Iris](getClass.getResource("/iris.dat").getPath) map { tuple ⇒
val list = tuple.productIterator.toList
val numList = list map (_.asInstanceOf[Double])
LabeledVector(numList(4), DenseVector(numList.take(4).toArray))
}
也许你在你的 SBT 中错误地声明了 Flink 依赖项,我有这样的:
val flinkDependencies = Seq(
"org.apache.flink" %% "flink-scala" % flinkVersion % "compile",
"org.apache.flink" %% "flink-ml" % flinkVersion % "compile",
"org.apache.flink" %% "flink-streaming-scala" % flinkVersion % "compile"
)
虽然,我认为当我在 apache flink 运行时执行项目时,我必须从外部读取文件,而不是从资源文件夹中读取文件,也许我的文件Setup.scala可以帮助你。
推荐阅读
- three.js - 在three.js中旋转对象
- c# - 是否可以使用 XAML 样式覆盖嵌套控件的一组 DependencyProperty?
- python - 关于for循环和reduce的Python之谜
- amazon-web-services - 将镶木地板文件加载到红移时如何格式化时间戳字段?
- angular - 如何识别 *ngFor 循环已完成标记更改?
- r - 标记非单调递增的数据
- javascript - jQuery 克隆不适用于同步融合控件
- c++ - 单击esc键时如何像通常的游戏一样暂停程序(游戏)?
- netlogo - NetLogo - 以一定的可能性死去
- ios - Swift NSMutableAttributedString NSMutableParagraphStyle firstLineHeadIndent 左间距问题