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
相关产品推荐
相关产品推荐

