当应用程序部署在 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,它也可以加载资源。)
上下文:我在 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,它也可以加载资源。)