Gradle构建WAR包后静态资源重复,Spring资源路径适配问题咨询
我来帮你搞定这个WAR包静态资源重复的坑~先给你捋清楚问题根源,再给你靠谱的解决方案:
问题原因
Spring Boot的默认规则是把src/main/resources/static里的静态资源打包到WAR包的/WEB-INF/classes/static目录下;而你设置了project.webAppDirName = 'src/main/resources/static'后,Gradle的WAR插件会把这个目录当作传统Web项目的webapp根目录,直接把里面的资源打包到WAR包的根路径下。两边同时打包,自然就出现重复资源了。
解决方案
推荐两种适配Eclipse同时避免重复的配置方式,选一种适合你的就行:
方案1:保留Spring Boot默认结构,仅适配Eclipse WTP
这种方法不用修改webAppDirName,只调整Eclipse WTP的配置,让它能识别src/main/resources/static作为静态资源目录,同时不干扰Gradle的WAR打包逻辑:
eclipse { wtp { facet { // 根据你的Web版本调整,比如用4.0对应Servlet 4.0 facet name: 'jst.web', version: '4.0' } component { // 告诉Eclipse WTP把static目录的资源部署到Web根路径 resource sourcePath: 'src/main/resources/static', deployPath: '/' // 如果原来的src/main/webapp目录还存在,记得排除它,避免额外干扰 if (file('src/main/webapp').exists()) { exclude sourcePath: 'src/main/webapp' } } } }
配置后,Eclipse里运行项目时能正常访问静态资源,Gradle打包WAR时只会把src/main/resources/static的资源放到/WEB-INF/classes/static下,不会重复。
方案2:移除传统webapp目录,调整WAR插件配置
如果你已经彻底放弃src/main/webapp目录,可以这样配置,让WAR插件不再重复打包静态资源:
// 保持Spring Boot默认的资源目录 // webAppDirName = 'src/main/resources/static' 这行可以删掉了 war { // 排除默认的webapp目录(如果已经删除,这步可省略) if (file('src/main/webapp').exists()) { exclude '**/*' } // 确保静态资源只通过Spring Boot的资源插件打包 dependsOn processResources }
这种方式完全遵循Spring Boot的资源管理规则,从根源上避免重复问题。
额外提醒
如果不需要传统Web项目的src/main/webapp目录,直接删掉它最省心,这样Gradle WAR插件就不会再处理这个目录,也减少了混淆的可能。
配置完后,你可以打个WAR包解压验证下,看看/WEB-INF/classes/static和WAR根目录下的资源是否还重复,正常情况下应该只有/WEB-INF/classes/static下的静态资源,Spring Boot会自动处理这些资源的访问路径。
内容的提问来源于stack exchange,提问作者Nabor

