scala - 如何从sbt/apache flink项目中的资源文件夹中打开文件

标签 scala intellij-idea resources sbt apache-flink

我正在使用 apache flink 开发一个基于 Scala 的项目,到目前为止我只在 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.FileSystemNotFoundExceptionjava.io.FileNotFoundException .

注意以下两者都工作 IntelliJ和 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 个变体之一类,因此我可以动态解析 IntelliJ 中的其他文件路径以及 flink 运行时?

最佳答案

这是读取我在以前的项目中使用的 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帮助你。

关于scala - 如何从sbt/apache flink项目中的资源文件夹中打开文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53741115/

相关文章:

scala - 如何为 Scala 中的任何集合创建一个通用的隐式类?

intellij-idea - 带有 Golang 的 IntelliJ 抛出 IllegalArgumentException

java - 确定企业 Web 应用程序的服务器硬件要求

java - 创建返回数据库实体的 oracle 过程

java.lang.ClassNotFoundException : text. 默认源

json - 在 Grails 2.3.x 的域类上更改 @Resource 结果的 max 属性的默认值

silverlight - 如何在两个(或更多)XAML 文件之间共享 VisualStateManager?

scala - 将无形可扩展记录传递给函数(续)

java - 可重入锁在 Java 中工作正常,但在 Scala 中导致 IllegalMonitorException

scala - 在 Spark 中使用前导窗口函数时是否可以忽略空值