Spring Boot 项目的 "运行机制" 和 "资源加载逻辑" ------target/classes
是后端服务实际 "读取资源" 的目录
-
编译打包阶段 :当你执行
mvn compile
(编译)或mvn package
(打包)时,Maven 会将src/main/resources
下的所有资源文件(静态资源、配置文件等)复制到target/classes
目录(这是 Maven/Gradle 等构建工具的 "约定"------ 将源码 / 资源编译为 "可运行的产物")。 -
服务运行阶段 :Spring Boot 启动后,会从
target/classes
目录 加载所有资源(包括application.yml
配置、static
静态资源等)------ 因为这个目录是 Java 程序默认的 "类路径(Classpath)根目录",所有编译后的代码(.class
文件)和资源文件都在这里,服务只能识别这个目录下的资源。
简单说:src/main/resources
是 "原料仓库",target/classes
是 "成品仓库",服务只会从 "成品仓库" 取货,不会直接去 "原料仓库"。
Spring Boot 对静态资源的默认映射规则(如 classpath:/static/
),其中的 classpath:
指的就是 target/classes
目录。
比如你配置的 spring.web.resources.static-locations: classpath:/static/
,实际指向的是:target/classes/static/
目录(而非 src/main/resources/static/
)。
如果 target/classes
下没有 static
目录,Spring Boot 会认为 "不存在 classpath:/static/
这个静态资源目录",自然无法找到 videos/0.mp4
,最终返回 404。
一般来说处了yml配置没正确外,就是pom中没包含正确的构建资源的目录
bash
<resources>
<!-- 1. 处理 src/main/java 下的 MyBatis Mapper XML(原有配置,保留) -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!-- 2. 处理 src/main/resources 下的所有文件(关键修改:添加 **/*) -->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include> <!-- 保留原有:XML 文件(如 MyBatis 配置) -->
<include>**/*.yml</include> <!-- 保留原有:YML 配置文件 -->
<include>**/*</include> <!-- 新增:允许所有文件/目录(包括 static) -->
</includes>
<!-- 可选:关闭资源过滤(避免静态文件被 Maven 篡改,如替换 ${} 变量) -->
<filtering>false</filtering>
</resource>
</resources>