Java Micronaut如何读取文件夹下文件 部署K8S后失效怎么解决
问题根因
本地IntelliJ运行时默认工作目录为项目根目录,你使用的Paths.get("mocks/file.json")是基于当前工作目录的相对路径,所以能正常读取。项目打包部署到K8S后,Jar包默认不会包含项目根目录下的mocks文件夹,容器运行时的工作目录下也没有对应路径,因此抛出文件不存在的错误。
解决方案
方案1:类路径加载(推荐,适合无需动态修改mock文件的场景)
- 调整文件路径:在
src/main/resources目录下新建mocks文件夹,将file.json移入该目录,最终路径为src/main/resources/mocks/file.json,Micronaut构建时会自动将resources下的文件打入Jar包类路径。 - 替换读取逻辑:不要使用文件系统API读取,改为通过类加载器读取类路径资源,参考代码如下:
@Controller("${endpoints.all.path}/v1/file") public class MyController { private static final Logger LOG = LoggerFactory.getLogger(MyController.class); // 注入Micronaut托管的ObjectMapper,避免自定义实例和全局序列化配置不一致 private final ObjectMapper objectMapper; public MyController(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @Get public HttpResponse<List<FileModel>> getAll() { try (InputStream inputStream = getClass().getResourceAsStream("/mocks/file.json")) { if (inputStream == null) { LOG.error("类路径下未找到/mocks/file.json资源"); return HttpResponse.serverError(); } List<FileModel> fileList = objectMapper.readValue(inputStream, new TypeReference<List<FileModel>>() {}); return HttpResponse.ok(fileList); } catch (IOException e) { LOG.error("mock文件读取解析失败: {}", e.getMessage(), e); return HttpResponse.serverError(); } } }
如果不想移动原文件位置,可在构建配置(build.gradle/pom.xml)中增加规则,将根目录下的mocks文件夹打包到类路径中,读取逻辑同上即可。
方案2:外部挂载(适合需要不重启修改mock内容的场景)
- 构建时无需将mocks目录打入Jar包
- K8S部署时通过ConfigMap或Volume将
file.json挂载到容器指定路径,比如/data/mocks/file.json - 把文件路径配置化:在
application.yml中增加配置项mock.file.path=/data/mocks/file.json,本地调试时可将该配置值改为项目根目录下的相对路径,代码中注入该配置后再通过文件API读取即可。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

