springboot打成jar包后读取resources下的文件

1、前言

程序打包为jar部署后测试发现资源文件找不到,查看代码发现使用的是ResourceUtils.getFile(“classpath:data/provinceName.json”)获取的资源文件,
打包为jar包后,会出现FileNotFoundException。
本地资源文件路径:
springboot打成jar包后读取resources下的文件_第1张图片

2、解决办法

原来的代码

    @GetMapping("/getPath")
    public JsonResp getPath() throws Exception {
        JsonResp<String> resp = new JsonResp<>(JsonResp.STATE_SUCCESS);
        File file = ResourceUtils.getFile("classpath:data/provinceName.json");
        String jsonData = jsonRead(file);
        resp.setData(jsonData);
        return resp;
    }

修改后的代码

    @GetMapping("/getPath1")
    public JsonResp getPath1() throws Exception {
        JsonResp<String> resp = new JsonResp<>(JsonResp.STATE_SUCCESS);
        InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("data/provinceName.json");
        String jsonData = readFile( inputStream );
        resp.setData(jsonData);
        return resp;
    }

其他方法

    @GetMapping("/getPath2")
    public JsonResp getPath2() throws Exception {
        JsonResp<String> resp = new JsonResp<>(JsonResp.STATE_SUCCESS);
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("data/provinceName.json");
        String jsonData = readFile( inputStream );
        resp.setData(jsonData);
        return resp;
    }
    @GetMapping("/getPath3")
    public JsonResp getPath3() throws Exception {
        JsonResp<String> resp = new JsonResp<>(JsonResp.STATE_SUCCESS);
        InputStream inputStream = new ClassPathResource("data/provinceName.json").getInputStream();
        String jsonData = readFile( inputStream );
        resp.setData(jsonData);
        return resp;
    }

3、为什么会这样

开发调试阶段,没有打包时,可以通过路径定位到资源文件,此时资源文件在如下位置:
springboot打成jar包后读取resources下的文件_第2张图片
打包后,Spring试图访问文件系统路径,但无法访问JAR中的路径。所以报错。此时资源文件在jar包中的classes文件中
springboot打成jar包后读取resources下的文件_第3张图片

你可能感兴趣的:(springboot打成jar包后读取resources下的文件)