【问题标题】:how read/reach/access a file from Kotlin when the application is deployed either in Kubernetes or Linux当应用程序部署在 Kubernetes 或 Linux 中时,如何从 Kotlin 读取/访问/访问文件
【发布时间】:2021-01-27 21:22:52
【问题描述】:

上下文:我在 Windows PC 上本地调试/运行时成功解析了一个 json 文件

import com.fasterxml.jackson.core.JsonFactory
import com.fasterxml.jackson.core.JsonParser
import java.io.File
import java.nio.file.Paths

...

val basePath = Paths.get("").toAbsolutePath().toString()

val parser: JsonParser = JsonFactory().createParser(File("$basePath/app/src/main/resources/support/certain-file.json"))

当我将它部署到 docker 或 AWS 时出现此错误

 /app/src/main/resources/support/certain-file.json (No such file or directory)

有没有更可靠的方法来“导航”到资源文件夹中的文件?我的意思是它不会受到影响,无论是 Windows/Linux/Kubernetes/etc 吗?

【问题讨论】:

  • 这取决于该文件的位置。在src/main/resources?
  • 绝对路径应该可以。您确定该文件存在于 AWS 上运行的映像中吗?没有可以安装在父文件夹顶部的卷?
  • @Eugene,是的,它在资源文件夹下
  • 访问资源的常用方法是通过类路径,而不是文件名。参见例如this question.
  • @gidds 谢谢,现在它正在工作。请给我一个概述,为什么 MyCurrentClass::class.java.getResource("/...").readText() 在 Windows 中都作为 Docker 工作,而我的上述方法基于 java.io.File 和 java.nio .file.Paths 仅适用于 Windows?也许您可以指出为什么您认为类路径是通常/更好的方式,然后我会为您解答。

标签: java linux kotlin kubernetes nio


【解决方案1】:

访问资源文件的常用方法是通过类路径,而不是直接访问文件系统。

这样做有几个优点:

  • 资源通常会与您编译的代码一起自动部署;无需手动复制。 (Maven 和 Gradle 通常知道以这种方式处理 src/main/resources 文件夹。)
  • 如果您将应用程序构建为 .jar/.war 文件,则资源将包含在其中。 (您的代码不需要知道或关心它们是否在存档中;只要您以流的形式访问资源,加载就可以正常工作。)
  • 应用程序不依赖于特定的目录布局或操作系统;它可以在任何机器上的任何目录中运行。
  • 您可以覆盖文件。由于类路径可以提供多个位置,因此可以通过将文件添加到较早位置来覆盖较晚位置的文件。

这很容易做到:只需在相关的类加载器上调用getResourceAsStream()。在这种情况下,它可能很简单:

val parser = javaClass.classLoader.getResourceAsStream("support/certain-file.json")?.use {
    JsonFactory().createParser(it)
}

这里javaClass.classLoader 获取当前类的ClassLoader。 (当然,您可以使用system 代替。)

use() 负责在读取结果后关闭InputStream

幸运的是,有一个接受InputStreamcreateParser() 方法。

(免责声明:我对 Kubernetes 或在 Windows 上运行 Kotlin/Java 程序一无所知。但使用类加载器的美妙之处在于您不需要!如果它可以加载类,它可以加载资源。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    相关资源
    最近更新 更多