You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot打包WAR/JAR后Docker部署无法访问静态HTML文件

解决Spring Boot Docker部署后静态资源404问题

我来帮你梳理下这个问题,毕竟静态资源访问在Spring Boot+Docker场景下确实容易踩坑,尤其是切换JAR/WAR打包方式的时候。

先明确核心规则:Spring Boot静态资源的默认路径

不管你用JAR还是嵌入式容器启动的WAR(注意是Spring Boot自带的Tomcat,不是外部Tomcat),Spring Boot默认会从这些classpath目录加载静态资源(优先级从高到低):

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/

只要你的index.html在这些目录里,理论上就能直接通过http://ip:port/index.html访问,甚至根路径http://ip:port也会自动匹配index.html作为欢迎页。

你的场景里的问题排查&解决方案

1. 先纠正几个你踩过的误区

  • WEB-INF目录不能放静态资源:这个目录是受Web容器保护的,外部无法直接通过URL访问,放到这里肯定404,直接排除。
  • JAR打包时src/main/webapp会被忽略:Maven的JAR打包插件不会识别这个目录,所以你往这里放文件等于白放,打包后根本不会包含进去。
  • WAR分两种情况:如果是用Spring Boot的spring-boot-starter-web自带的Tomcat启动WAR,规则和JAR完全一致;如果是部署到外部Tomcat,那src/main/webapp下的文件会被放到WAR根目录,这时候可以直接访问,但这种场景现在已经不推荐了。

2. 针对你的CI/CD+Docker场景的正确步骤

方案一:用JAR包(Spring Boot官方推荐)

这是最不容易出问题的方式:

  1. 在Jenkins的构建流程里,把Spring Rest Docs生成的index.html复制到target/classes/static目录(或者src/main/resources/static,Maven打包时会自动把src/main/resources的内容同步到target/classes)。
  2. 执行mvn clean package生成JAR包,然后用以下Dockerfile构建镜像:
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/your-app.jar app.jar
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "app.jar"]
  1. 启动容器后,直接访问http://ip:8081/index.html或者根路径http://ip:8081即可。

方案二:用嵌入式WAR包

如果你坚持用WAR格式,但还是用Spring Boot自带的容器启动:

  1. 同样把index.html复制到target/classes/static或src/main/resources/static。
  2. 执行mvn clean package生成WAR包,Dockerfile改成:
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/your-app.war app.war
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "app.war"]
  1. 访问方式和JAR包完全一致。

3. 关键验证步骤

如果还是404,一定要做这几步排查:

  • 检查打包后的文件位置:用jar tf your-app.jar(JAR包)或jar tf your-app.war(WAR包)命令,确认index.html是否在BOOT-INF/classes/static/(JAR)或WEB-INF/classes/static/(WAR)目录下。
  • 检查Docker容器内的文件:进入容器执行docker exec -it your-container-id /bin/bash,然后用同样的jar tf命令确认文件存在。
  • 检查是否有自定义配置覆盖默认规则:如果你的项目里写了WebMvcConfigurer实现,重写了addResourceHandlers,一定要确保默认的静态资源路径被保留:
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/static/", "classpath:/public/", "classpath:/resources/");
    }
}
  • 查看应用启动日志:确认Spring Boot正常启动,有没有类似这样的日志(说明静态资源映射已经生效):
INFO 1 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]

内容的提问来源于stack exchange,提问作者FishingIsLife

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:51:21