SpringBoot中classpath路径是什么?如何正确读取资源文件?

 更新时间:2026年07月13日 11:13:03   作者:zzh___zzh  
还在为SpringBoot中资源路径配置发愁吗?本文深入浅出地解析了ClassPathResource的用法、classpath的含义以及resources目录结构,帮你搞懂静态资源和动态文件的区别,掌握文件读取的最佳实践,避免因路径错误导致的线上问题

一、ClassPathResource是什么?

代码:

ClassPathResource resource =
        new ClassPathResource("template/" + tableName + ".xlsx");

拆分:

ClassPathResource

=

ClassPath + Resource

含义:

从Java程序运行时的类路径(classpath)中查找资源文件。

常用于读取:

  • Excel模板
  • 配置文件
  • XML文件
  • JSON文件
  • 图片等项目内部资源

二、什么是classpath?

classpath:

中文:

类路径

简单理解:

Java程序运行时寻找类和资源文件的位置。

Spring Boot项目结构:

项目
|
|-- src
    |
    |-- main
        |
        |-- java
        |
        |-- resources

其中:

java目录

存放:

Java代码

例如:

Controller.java

Service.java

Entity.java

resources目录

存放:

项目资源文件

例如:

application.yml

Excel模板

XML文件

图片

JSON文件

三、resources为什么叫classpath?

项目启动后:

Maven会把:

src/main/resources

复制到:

target/classes

例如:

项目中:

src/main/resources/template/user.xlsx

编译后:

target/classes/template/user.xlsx

运行时:

target/classes

就是classpath。

所以:

classpath
=
target/classes
=
resources目录

四、template/为什么是在IDEA项目里面?

代码:

new ClassPathResource("template/user.xlsx");

这里的:

template/

不是:

浏览器路径

也不是:

http://localhost:8080/template/user.xlsx

而是:

后端项目resources目录下的文件夹

例如:

项目:

src/main/resources

    |
    |-- template

            |
            |-- user.xlsx

代码:

new ClassPathResource("template/user.xlsx");

Spring会寻找:

classpath/template/user.xlsx

实际位置:

target/classes/template/user.xlsx

五、浏览器和classpath的区别

浏览器访问:

http://localhost:8080/download/template

表示:

访问后端接口

浏览器不知道:

template/user.xlsx

这个文件。

完整流程:

浏览器

    |
    | HTTP请求

    ↓

Controller

    |
    | ClassPathResource读取文件

    ↓

resources/template/user.xlsx

    |
    | 输出文件流

    ↓

浏览器下载文件

六、为什么模板文件放resources?

因为模板属于:

系统固定资源

例如:

  • Excel导入模板
  • Word合同模板
  • 邮件模板

特点:

开发人员维护

不会频繁变化

跟项目一起发布

所以放:

resources

七、Spring Boot常见资源目录

1. resources根目录

结构:

resources

    |
    |-- application.yml

用途:

配置文件

读取:

new ClassPathResource("application.yml");

2. template目录

结构:

resources

    |
    |-- template

            |
            |-- user.xlsx

用途:

模板文件

例如:

  • Excel模板
  • Word模板
  • 邮件模板

读取:

new ClassPathResource("template/user.xlsx");

3. static目录

结构:

resources

    |
    |-- static

            |
            |-- css

            |-- js

            |-- images

用途:

静态资源

例如:

  • CSS
  • JavaScript
  • 图片

浏览器可以直接访问:

localhost:8080/logo.png

4. public目录

结构:

resources/public

作用:

和static类似。

用于:

公开访问的静态文件

5. templates目录

注意:

template

和:

templates

不是一个东西。

templates:

用于:

后端页面模板

例如:

Thymeleaf:

resources/templates/user.html

Controller:

return "user";

Spring寻找:

templates/user.html

6. mapper目录

结构:

resources

    |
    |-- mapper

            |
            |-- UserMapper.xml

用途:

MyBatis XML映射文件

配置:

mybatis:
  mapper-locations:
    classpath:mapper/*.xml

表示:

从resources/mapper目录寻找xml文件

7. db目录

结构:

resources

    |
    |-- db

            |
            |-- schema.sql

            |-- data.sql

用途:

数据库初始化脚本

八、classpath:是什么意思?

经常看到:

mybatis:
  mapper-locations:
    classpath:mapper/*.xml

classpath表示:

从类路径开始查找

也就是:

resources目录开始查找

例如:

classpath:mapper/UserMapper.xml

实际位置:

src/main/resources/mapper/UserMapper.xml

九、ClassPathResource和File路径区别

1. ClassPathResource

代码:

new ClassPathResource("template/test.xlsx");

查找:

项目内部资源

位置:

resources目录

适合:

  • 模板文件
  • 配置文件
  • 固定资源

特点:

跟随项目打包

2. File文件路径

例如:

File file =
new File("/home/bes/upload/test.zip");

查找:

服务器磁盘

例如:

/home/bes/upload

适合:

  • 用户上传文件
  • 临时文件
  • 业务数据文件

特点:

运行过程中动态产生

十、为什么上传文件不用ClassPathResource?

上传文件:

例如:

202605.zip

属于:

用户产生的数据

不能放:

resources

原因:

项目重新打包:

jar重新生成

可能导致:

文件丢失

所以:

上传文件保存:

服务器磁盘目录

例如:

/home/bes/upload

    |
    |--202605

            |
            |--tableName

                    |
                    |--xxx.zip

十一、结合项目中的两个场景

场景1:下载Excel模板

文件:

resources

    |
    |--template

            |
            |--config.xlsx

代码:

ClassPathResource resource =
new ClassPathResource("template/config.xlsx");

特点:

系统自带

固定文件

开发维护

场景2:下载用户上传文件

用户上传:

202605.zip

保存:

/home/bes/upload/202605/tableName/

读取:

File

InputStream

FileInputStream

特点:

用户产生

动态文件

数量变化

十二、总结

记忆:

ClassPathResource

=

找项目内部resources中的资源
classpath:

=

从resources目录开始查找
File路径

=

找服务器磁盘上的文件

对应关系:

系统模板文件

        ↓

resources/template

        ↓

ClassPathResource



用户上传文件

        ↓

服务器磁盘目录

        ↓

File路径

一句话:

固定的系统资源放resources,用ClassPathResource读取;动态产生的业务文件放服务器磁盘,用File路径读取。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • spring cloud整合ribbon问题及解决方案

    spring cloud整合ribbon问题及解决方案

    很多小伙伴在整合ribbon都出了相同的问题,今天特地为大家整理了该问题的解决方案,文中有非常详细的图文解说,对出现同样问题的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • Java解析word,获取文档中图片位置的方法

    Java解析word,获取文档中图片位置的方法

    下面小编就为大家分享一篇Java解析word,获取文档中图片位置的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 解决CollectionUtils.isNotEmpty()不存在的问题

    解决CollectionUtils.isNotEmpty()不存在的问题

    这篇文章主要介绍了解决CollectionUtils.isNotEmpty()不存在的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • JVM垃圾回收机制之GC解读

    JVM垃圾回收机制之GC解读

    这篇文章主要介绍了JVM垃圾回收机制之GC,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • SpringBoot定时任务多线程实现示例

    SpringBoot定时任务多线程实现示例

    在真实的Java开发环境中,我们经常会需要用到定时任务来帮助我们完成一些特殊的任务,本文主要介绍了SpringBoot定时任务多线程实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 深入了解Java中的类加载机制

    深入了解Java中的类加载机制

    通常,在关于Java的类加载部分会遇到以上疑问,本文将对类加载重要部分做详细介绍,包括重要的基础概念和应用场景,在编写过程中也帮助作者重新熟悉并加固了知识点,希望在看完后对大家能有所帮助
    2022-11-11
  • java判定数组或集合是否存在某个元素的实例

    java判定数组或集合是否存在某个元素的实例

    下面小编就为大家带来一篇java判定数组或集合是否存在某个元素的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Java中实现Map按值排序的多种方法

    Java中实现Map按值排序的多种方法

    Java的Map接口默认不保证元素的顺序,本文介绍如何使用TreeMap、Collections.sort()结合Entry、Stream API以及Guava库等技术手段实现Map按值排序,每种方法都有其特点,在选择具体方法时应考虑项目的具体需求及个人偏好,需要的朋友可以参考下
    2025-03-03
  • 基于Spring Cloud Zookeeper实现服务注册与发现

    基于Spring Cloud Zookeeper实现服务注册与发现

    这篇文章主要介绍了基于Spring Cloud Zookeeper实现服务注册与发现,帮助大家更好的理解和学习spring框架,感兴趣的朋友可以了解下
    2020-11-11
  • feign远程调用无法传递对象属性405的问题

    feign远程调用无法传递对象属性405的问题

    这篇文章主要介绍了feign远程调用无法传递对象属性405的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论