前言:这个是昨天晚上在部署一个项目的时候发现的,在此记录一下
关于SpringBoot项目通过jar包启动之后无法读取项目根路径静态资源
问题描述
在部署了一个项目之后,打开项目页面进行测试,发现有一个查询页面查询失败了,自动跳转到错误页面,我看了看日志,发现是一个文件读取失败了,如下图:
报错信息
被读取文件所在目录
文件读取部分的代码
public String readFileContent() {File file = new File("src/main/resources/static/ticket/station_name.txt");BufferedReader reader = null;StringBuffer sbf = new StringBuffer();try {reader = new BufferedReader(new FileReader(file));String tempStr;while ((tempStr = reader.readLine()) != null) {sbf.append(tempStr);}reader.close();return sbf.toString();} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e1) {e1.printStackTrace();}}}return sbf.toString();}
当时我挺懵批的,因为这个文件在本地测试的时候还是能读取到的,为什么到了服务器就找不到了呢???
解决方法
我上网查阅了一番,发现使用 File 在服务器中来获取本地资源是存在问题的。
原因:
Resources 目录下的文件是存在于 xxx.jar 这个文件里面,在服务器磁盘上是没有真实路径存在的,它其实是位于jar内部的一个路径。
解决方法一(笨方法):
将待读取的文件上传到服务器相应目录下,将读取的文件路径改成服务器上面文件对应的路径。
解决方法二:
使用输入流,如下:
public String readFileContent() throws Exception{String filePath = "static/ticket/station_name.txt";InputStream inputStream = null;BufferedReader reader = null;StringBuffer sbf = new StringBuffer();//文件读取inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath);reader = new BufferedReader(new InputStreamReader(inputStream));String tempStr;while ((tempStr = reader.readLine()) != null) {sbf.append(tempStr);}reader.close();return sbf.toString();}
public String readFileContent() throws Exception{String filePath = "static/ticket/station_name.txt";ClassPathResource resource = new ClassPathResource(filePath);InputStream inputStream = null;BufferedReader reader = null;StringBuffer sbf = new StringBuffer();//文件读取inputStream = resource.getInputStream();reader = new BufferedReader(new InputStreamReader(inputStream));String tempStr;while ((tempStr = reader.readLine()) != null) {sbf.append(tempStr);}reader.close();return sbf.toString();}
这里要注意的是,使用的路径是 resources 底下的路径。
PS:也可以到我的个人博客查看更多内容
个人博客地址:小关同学的博客