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

Spring Boot 3+Jersey部署外部Tomcat无法提供静态内容问题

Spring Boot 3.0.2部署外部Tomcat静态资源404问题排查

1. WAR包未正确包含静态资源

IDE运行时,src/main/webapp目录下的文件会被直接加载,但打包WAR时如果Maven配置不当,该目录内容可能不会被纳入最终WAR包。

  • 手动解压生成的WAR包,检查WEB-INF同级目录下是否存在你的HTML文件;如果缺失,给pom.xml添加war插件配置确保资源被打包:
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.2</version>
                <configuration>
                    <webResources>
                        <resource>
                            <directory>src/main/webapp</directory>
                            <filtering>false</filtering>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

2. 外部Tomcat上下文路径不匹配

IDE运行时应用默认根路径为/,但部署到外部Tomcat时,若WAR包名称不是ROOT.war,上下文路径会自动变为WAR包名称。比如WAR名为myapp.war,访问路径应为localhost:8080/myapp/filename.html,而非直接localhost:8080/filename.html。

  • 要么将WAR包重命名为ROOT.war,要么访问时加上正确的上下文路径。

3. Jersey Filter拦截了静态资源请求

虽然配置了FILTER_FORWARD_ON_404=true和spring.jersey.type=filter,但外部Tomcat中Jersey的拦截规则可能覆盖静态资源请求,导致请求无法到达Tomcat默认Servlet。

  • 检查Jersey配置类的@ApplicationPath注解,若设为/*,所有请求都会先经过Jersey,转发逻辑在外部Tomcat与嵌入式容器存在差异。建议改为/api这类特定路径,让静态资源请求直接由Tomcat处理。
  • 或者在Jersey配置中排除静态资源路径,示例代码:
    @Override
    public void configure(ServletContext servletContext) {
        servletContext.addFilter("StaticResourceFilter", new OncePerRequestFilter() {
            @Override
            protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
                String path = request.getRequestURI();
                // 根据你的静态资源后缀或路径调整规则
                if (path.endsWith(".html") || path.startsWith("/static/")) {
                    filterChain.doFilter(request, response);
                } else {
                    servletContext.getNamedDispatcher("jersey").forward(request, response);
                }
            }
        }).addMappingForUrlPatterns(null, false, "/*");
    }
    

4. 缺失Spring Boot WAR部署初始化类

IDE运行时无需该类,但部署到外部Tomcat必须存在SpringBootServletInitializer子类,否则Tomcat无法正确初始化Spring Boot应用,导致静态资源无法访问。

  • 创建初始化类示例:
    public class ServletInitializer extends SpringBootServletInitializer {
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(你的启动类.class);
        }
    }
    

5. 外部Tomcat静态资源配置异常

检查Tomcat的conf/web.xml,确认负责处理静态资源的default Servlet是否正常配置,若该配置被修改或禁用,会导致静态资源404。正常配置如下:

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:40:30