问题描述
在我的 SpringBoot 应用程序中,我必须在这个路径 src/main/resources/mock/fileName.json 读取一个 Json 文件。 我是这样做的
JsonReader jsonReaderStream = new JsonReader(new InputStreamReader(Objects.requireNonNull(ClassLoader.getSystemClassLoader().getResourceAsstream("./mock/fileName.json"))));
它在本地工作,但是当我在 Kubernetes 上部署我的 docker 文件并尝试读取我的 Json 文件时,我收到了 NullPointerException。 我使用 gradle 进行构建。我声明我是 gradle、docker 和 kubernetes 的初学者。
谁能向我解释为什么它可以在本地运行,而不能在 Kubernetes 上运行?
解决方法
看起来您正在尝试为方法 getResourceAsStream
提供文件路径,但它没有提供。 JavaDoc 不是很好,您必须将不同的文档拼凑在一起才能理解它,但这里有一些相关部分:
查找具有给定名称的资源。资源是一些数据(图像、音频、文本等),可以通过类代码以独立于代码位置的方式访问。 资源的名称是一个以“/”分隔的路径名,用于标识资源。
[...]
在上面,资源的包名是 从最后一个 '/' 之前的字符的子序列派生 在名称中,然后替换子序列中的每个“/”字符 和 '。'。派生包名称时忽略前导斜杠。 例如,为名为的资源派生的包名称 “a/b/c/foo.properties”是“a.b.c”。
因此,要在正在运行的系统的类路径上找到您的资源,请删除 ./
部分,使其仅显示为:.getResourceAsStream("mock/fileName.json")
。
这里有两种可能。
- 未打包,未找到
- 已打包,未找到
进入 .jar
包,检查您的 mock/x.json
是否存在于 target\example.jar!\BOOT-INF\classes
中。
如果正在打包但未找到,请参阅this answer。new ClassPathResource("./mock/fileName.json")
然后使用 resource.getInputStream()
。
强烈建议你把这些静态json文件放在resources/static/
下,这样你就可以直接把这些文件比如resources/static/mock/a.json
,作为/mock/a.json
的请求