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

Maven打包生成的application.jar未包含webapp目录问题排查

问题根因

这个问题和Dockerfile配置无关,是Maven打包逻辑的默认行为导致的:
Spring Boot构建可执行JAR时,默认不会将src/main/webapp目录下的内容打包进最终产物。src/main/webapp是传统WAR包部署约定的资源目录,可执行JAR场景下内嵌Web容器无法直接读取JAR包内该路径下的资源,因此默认构建插件会忽略这个目录。

对应解决方案

根据你项目的资源类型二选一即可:

方案1:使用WAR包打包(适配webapp下存JSP等强依赖webapp目录的场景)

  • 修改pom.xml中的打包类型,将默认的jar改为war:
<packaging>war</packaging>
  • 保持内嵌Tomcat依赖的scope为默认(不要设为provided),即可继续通过java -jar方式启动包,Spring Boot的layertools分层模式原生支持WAR包,仅需要修改Dockerfile中对应解压和拷贝的文件名后缀:
# 拷贝构建好的war包
COPY target/application.war ./
# 分层解压war包
RUN java -Djarmode=layertools -jar application.war extract

执行打包后webapp目录下的所有资源会被自动打入WAR包中。

方案2:保持JAR包打包,调整资源配置

如果不需要兼容JSP,优先把webapp下的静态资源移到Spring Boot JAR默认扫描的资源路径:

  • 静态资源(js/css/图片等)移到src/main/resources/static
  • 模板页面移到src/main/resources/templates
    调整后不需要额外配置,打包时资源会自动进入JAR包。

如果要保留现有webapp目录结构不移动文件,在pom.xml中增加maven资源插件配置,强制将webapp目录下的文件打入JAR包的META-INF/resources路径(内嵌容器默认扫描该路径下的web资源):

<build>
    <resources>
        <!-- 保留默认的resources目录配置 -->
        <resource>
            <directory>src/main/resources</directory>
        </resource>
        <!-- 新增webapp目录的资源映射 -->
        <resource>
            <directory>src/main/webapp</directory>
            <targetPath>META-INF/resources</targetPath>
        </resource>
    </resources>
</build>

注意:Spring Boot官方明确不支持在可执行JAR中运行JSP,如果webapp下存的是JSP文件,不要用这个方案,直接选方案1打WAR包,否则启动后会出现404找不到JSP页面的问题。

排查校验

配置修改后重新执行mvn clean package,解压target目录下的构建产物,确认对应资源存在后再执行Docker镜像构建即可。如果还是找不到资源,检查pom.xml中是否自定义了spring-boot-maven-plugin或maven-resources-plugin的排除规则,误将webapp路径加入了排除列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:42:52