解決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, .....
        }
    }

搞定!

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: