我的 springboot 应用程序的资源目录中有一个文件 merge.json,该应用程序在 docker 中运行。
“jar -tf app.jar”在结果中显示 BOOT-INF/classes/merge.json。
在代码中我尝试将其读作:
@Autowired
private ResourceLoader resourceLoader;
....
....
Resource resource = this.resourceLoader.getResource("classpath:merge.json");
File file = resource.getFile();
Files.readString(file.toPath());
但它给出了错误:
java.io.FileNotFoundException:类路径资源 [merge.json] 不能 被解析为绝对文件路径,因为它不驻留在 文件系统:jar:nested:/../../app.jar/!BOOT-INF/classes/!/merge.json
我在这里缺少什么?
当您的 Spring Boot 应用程序从 JAR 文件运行时,像
merge.json
这样的资源将打包在 JAR 中,而不是作为文件系统上的单独文件。这就是为什么调用 resource.getFile()
不起作用,因为它试图在系统上查找文件,而在本例中该文件不存在。
要从 JAR 内部读取文件,您应该使用 InputStream:
@Autowired
private ResourceLoader resourceLoader;
Resource resource = this.resourceLoader.getResource("classpath:merge.json");
try (InputStream inputStream = resource.getInputStream()) {
String content = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
}