一、问题场景
最近遇到一个很奇怪的问题,放在资源目录下的文件,在本地跑的时候能正常获取,打jar包后部署在服务器上时就会报FileNotFoundException,这种本地跑和服务器上运行结果不一样的问题往往最让人绝望,当你周五下班前信誓旦旦的和领导说任务完成了,第二天领导打电话让你来加班 ???
二、问题发现
之前的代码逻辑为:先获取资源文件的路径,再通过该路径读取文件
String templatePath = PDFServiceImpl.class.getClassLoader().getResource("pdfResources/cpxys.pdf").getPath();
PdfReader reader = new PdfReader(templatePath);
查看报错日志后,发现在服务器上调用该方法读取资源文件的路径是这样:
看到报错路径后瞬间就明白了。服务器上的代码在获取资源目录下的文件路径时会带有jar包路径,这个路径显然是不对的,如果用这个路径去获得文件当然就找不到啦。
而在本地debug调试中,可以发现获得的路径是正确的:
三、解决办法
修改后代码逻辑:通过文件输入流的方式读取文件,这样就不存在路径的问题了。
InputStream templateInputStream = PDFServiceImpl.class.getClassLoader().getResource("pdfResources/cpxys.pdf").openStream();
PdfReader reader = new PdfReader(templateInputStream);