问题描述:JAR包部署到生产环境上加载不到资源(fIle not found exeception),但本地IDEA是可以加载的。
image.png

  1. new FileReader("classpath:template/merge_sql_template.sql");

原因:和war部署不同,resources下的文件是存在在jar包中的,仅是jar中的内部路径,在磁盘中没有真实路径。直接用File读取是访问真实路径,故访问不到。

解决:绕过创建File的方式,直接使用 this.getClass().getClassLoader().getResourceAsStream 获取内部jar文件的输入流

  1. String mergeSqlTemplate = "";
  2. try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("sql/merge_sql_template.sql");) {
  3. byte[] buff = new byte[1024];
  4. int btr = 0;
  5. while ((btr = inputStream.read(buff)) != -1) {
  6. mergeSqlTemplate += new String(buff, 0, btr, "UTF-8");
  7. }
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. throw new GeneralException("模版文件解析失败");
  11. }

参考

【1】:https://blog.csdn.net/supersolon/article/details/119023255