当应用程序部署在 Kubernetes 或 Linux 中时,如何 read/reach/access 来自 Kotlin 的文件

how read/reach/access a file from Kotlin when the application is deployed either in Kubernetes or Linux

上下文:我在 Windows PC 中以这种方式 debugging/running 在本地成功解析 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?

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

这样做有几个好处:

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

这很容易做到:只需在相关的 classloader 上调用 getResourceAsStream()。在这种情况下,它可以像这样简单:

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

当然,这里 javaClass.classLoader 获取当前 class 的 ClassLoader.  (You could use the system。)

use() takes care of closing the resulting InputStream 一旦阅读。

幸运的是,有一个 createParser() 方法接受 InputStream.

(免责声明:我对 Kubernetes 或 Windows 上的 运行ning Kotlin/Java 程序一无所知。但是使用 classloader 的好处是你不需要!如果它可以加载 classes,它也可以加载资源。)