关于SpringBoot项目通过jar包启动之后无法读取项目根路径静态资源

前言:这个是昨天晚上在部署一个项目的时候发现的,在此记录一下

关于SpringBoot项目通过jar包启动之后无法读取项目根路径静态资源

问题描述

在部署了一个项目之后,打开项目页面进行测试,发现有一个查询页面查询失败了,自动跳转到错误页面,我看了看日志,发现是一个文件读取失败了,如下图:

报错信息

在这里插入图片描述

被读取文件所在目录

在这里插入图片描述

文件读取部分的代码

    public String readFileContent() {
        File file = new File("src/main/resources/static/ticket/station_name.txt");
        BufferedReader reader = null;
        StringBuffer sbf = new StringBuffer();

        try {
            reader = new BufferedReader(new FileReader(file));
            String tempStr;
            while ((tempStr = reader.readLine()) != null) {
                sbf.append(tempStr);
            }
            reader.close();
            return sbf.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
        return sbf.toString();
    }

当时我挺懵批的,因为这个文件在本地测试的时候还是能读取到的,为什么到了服务器就找不到了呢???

解决方法

我上网查阅了一番,发现使用 File 在服务器中来获取本地资源是存在问题的。

原因:
Resources 目录下的文件是存在于 xxx.jar 这个文件里面,在服务器磁盘上是没有真实路径存在的,它其实是位于jar内部的一个路径。

解决方法一(笨方法):
将待读取的文件上传到服务器相应目录下,将读取的文件路径改成服务器上面文件对应的路径。

解决方法二:
使用输入流,如下:

    public String readFileContent() throws Exception{

        String filePath = "static/ticket/station_name.txt";
        InputStream inputStream = null;
        BufferedReader reader = null;
        StringBuffer sbf = new StringBuffer();

        //文件读取
        inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath);
        reader = new BufferedReader(new InputStreamReader(inputStream));
        String tempStr;
        while ((tempStr = reader.readLine()) != null) {
            sbf.append(tempStr);
        }
        reader.close();
        return sbf.toString();
    }
    public String readFileContent() throws Exception{

        String filePath = "static/ticket/station_name.txt";
        ClassPathResource resource = new ClassPathResource(filePath);
        InputStream inputStream = null;
        BufferedReader reader = null;
        StringBuffer sbf = new StringBuffer();

        //文件读取
        inputStream = resource.getInputStream();
        reader = new BufferedReader(new InputStreamReader(inputStream));
        String tempStr;
        while ((tempStr = reader.readLine()) != null) {
            sbf.append(tempStr);
        }
        reader.close();
        return sbf.toString();
    }

这里要注意的是,使用的路径是 resources 底下的路径。

PS:也可以到我的个人博客查看更多内容
个人博客地址:小关同学的博客

### Spring Boot 项目 JAR 文件方法 #### 插入 Maven 构建插件 为了使Spring Boot项目能够被打成一个独立的、可执行的JAR文件,在`pom.xml`中需引入特定的Maven构建插件。具体来说,是在项目的POM文件内加入如下片段: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ``` 上述配置使得Maven具备了处理Spring Boot应用的能力,从而可以创建含所有依赖项以及应用程序本身的单一JAR文件[^1]。 #### 使用命令行工具进行打操作 完成必要的配置更改之后,可以通过命令行来触发实际的打过程。对于大多数情况而言,只需简单地运行以下指令即可实现目标: ```bash mvn clean package ``` 这条命令会清理旧版本的目标目录(`clean`)并编译当前源码(`package`),最终生成所需的JAR文件位于`target/`子目录下。 #### 外部化配置管理 当涉及到外部化的配置文件如`application.yml`时,默认情况下这些会被嵌入到产生的JAR之中。然而如果希望保持灵活性——允许不同环境中使用不同的配置,则可以选择不在打阶段含此文件,并通过命令参数指定替代位置或名称,例如: ```bash java -jar myapp.jar --spring.config.name=mycustomconfig ``` 这表明即使原始的应用程序并未携带默认配置文件,也可以在启动期间动态加载来自其他地方的设定[^4]。 #### 解决资源读取问题 值得注意的是,一旦项目被打JAR形式后,访问内部资源的方式可能会有所变化。特别是针对那些原本放置于classpath路径下的静态资源(比如XML配置),应当采用类加载器的方式来获取其输入流而不是直接基于文件系统的相对路径。下面是一个修正后的例子用于解决无法找到resources下的XML文件的问题: ```java ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); InputStream inputStream = classLoader.getResourceAsStream(String.format("config/config-%s.xml", modelType)); Document document = saxBuilder.build(inputStream); ``` 这里利用了Java ClassLoader机制确保无论资源处于何种物理存储介质上都能正确定位和打开它们[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值