Resource r = new ClassPathResource('tpl/a.ftl');
InputStream in = r.getInputStream();
# 或 getClass().getResourceAsStream('/tpl/a.ftl')

本地读模板正常,打成 jar 部署后报 FileNotFoundException,提示 cannot be resolved to absolute file path because it does not reside in the file system。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,jar 里的资源不是独立文件,ClassPathResource 的 getFile 需要真实路径,打成包后根本拿不到。

「jar 内资源读取」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

处理上按这个顺序:改用 getResourceAsStream 读取;确实需要文件就先复制到临时目录;不要用 getFile 拼路径。

改完只确认一件事:jar 部署后模板能正常加载,导出内容与本地一致。

作者 9823189