评论

收藏

[Java] 解决springboot项目找不到resources目录下的资源问题

编程语言 编程语言 发布于:2021-11-14 16:46 | 阅读数:590 | 评论:0

这篇文章主要介绍了解决springboot项目找不到resources目录下的资源问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
springboot项目找不到resources目录下的资源
问题描述:
将老的mvc项目转为boot后找不到resources文件夹下的资源文件
原因:
war包采用的是tomcat部署,tomcat会对war包进行解压,以及目录的一些操作。而springboot使用jar包部署,服务器中是不存在相关目录的。
环境:
springboot 2.2.2RELAESE
主要的API:
ClassPathResource classPathResource = new ClassPathResource(filePath);
InputStream inputStream = classPathResource.getInputStream();
工具类
import java.io.File;
import java.io.InputStream; 
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ClassPathResource; 
 
public class FileUtil { 
  public File getResourceFile(String filePath) throws Exception{
 
    try {
      ClassPathResource classPathResource = new ClassPathResource(filePath);
 
      InputStream inputStream = classPathResource.getInputStream();
      //生成目标文件
      File somethingFile = File.createTempFile("DailyReportTemplate", ".xls");
      try {
        FileUtils.copyInputStreamToFile(inputStream, somethingFile);
      } finally {
        IOUtils.closeQuietly(inputStream);
      }
 
      return somethingFile;
    } catch (Exception e) {
      throw new Exception(e);
    }
  } 
}
运行jar文件时,ClassPathResource无法读取到资源文件的问题
问题场景:
在idea中运行,一切正常,资源文件都可以访问到,但打成jar包后,使用java -jar的形式去启动,就访问不到resource下的资源文件了
网上搜了很多文章,但试了后都不好使
我的路径是配置在properties文件中,然后读取配置文件中的值,然后拼接文件路径,再使用ClassPathResource去读取的
开始时我配置文件中是这样写的:
#路径中注意首尾不要有空格
service.config-root=static/service/
service.config-name=AppConfig.json
程序代码读出后拼接:
@Value("${service.config-root}")
private String configRoot; 
@Value("${service.config-name}")
private String configName;
 
.....省略无关code..... 
 
public String getPath(){
  String configPath = this.configRoot + this.configName;
  return configPath;
}
但运行jar后,直接FileNotFoundException了
解决:
方案1:
主要是斜杠"\"和反斜杠"/"的问题,配置文件修改如下:
#路径中注意首尾不要有空格
service.config-root=static\\tileservice\\
service.config-name=AppConfig.json
方案2:
使用"File.spearator"拼接路径
service.config-root=static
service.config-name=AppConfig.json
@Value("${service.config-root}")
private String configRoot; 
@Value("${service.config-name}")
private String configName;
 
.....省略无关code.....
 
 public static <T> T readJsonFromClassPath(Type type) throws IOException {
    //这里使用File.spearator拼接
    ClassPathResource resource = new ClassPathResource(this.configRoot + File.spearator  + this.configName);
    if (resource.exists()) {
      return JSON.parseObject(resource.getInputStream(), StandardCharsets.UTF_8, type, .....
    }
  }
搞定!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持CodeAE代码之家
原文链接:https://blog.csdn.net/the_fool_/article/details/103769185

关注下面的标签,发现更多相似文章