SpringBoo项目打包部署Linux后访问不到 resources 下面的模板文件


1 Bug场景

1.1 在开发中经常需要获取资源文件路径,例如读写配置文件,获取resource下的模板文件等

1.2 Windows获取resource下的模板文件,在本地是可以直接获取模板文件并操作

// 第一中方式:getDefaultClassLoader已经过期了
//
String path = ClassUtils.getDefaultClassLoader().getResource("static/" + templateFilePath).getPath();

// 推荐使用这种方式 String path = this.getClass().getClassLoader().getResource("static/template/Excel.xlsx").getPath();
FileInputStream fileInputStream
= new FileInputStream(paths);

1.3 Linux获取resource下的模板文件,jar包明明是有模板文件但是报错找不到

2 Bug原因

意思读取不到jar包里面的文件,因为springboot是打包jar包,然后是执行运行的jar包,而不是读取的target下面编译好的文件。

由于 Windows 加载本地文件和 Linux 加载本地文件有区别,所以在加载本地文件时,使用方法有所不同。

3 解决方法:通过获取流的方式操作

3.1 Windows获取resource下的模板文件

// 第一中方式:getDefaultClassLoader已经过期了
// String path = ClassUtils.getDefaultClassLoader().getResource("static/" + templateFilePath).getPath();

// 推荐使用这种方式 String path = this.getClass().getClassLoader().getResource("static/template/Excel.xlsx").getPath();
FileInputStream fileInputStream = new FileInputStream(paths);

3.2 Linux获取resource下的模板文件

InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("static/template/Excel.xlsx");

3.3 参考示例:网站地址