Maven War插件配置异常:无法将resources目录复制到War包并加载CSS
Maven War包静态资源配置问题解决
问题背景
我是Maven初级用户,想把src/main/resources目录下的资源复制到生成的War包中,方便JSP文件引入CSS样式。但执行mvn clean install后发现css文件夹被打包到了WEB-INF/classes目录下,即便修改JSP的引入路径,也无法正确加载CSS文件。
现有配置
servlet.xml
<mvc:resources location="/resources" mapping="/resources/**"></mvc:resources>
pom.xml
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <web-resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.css</include> </includes> </resource> </web-resources> <outputDirectory>../../tomcat/webapps</outputDirectory> </configuration> </plugin> </plugins>
JSP文件
<header> <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/resources/css/style.css"> </header>
本地资源结构
- resources
-- css
style.css
问题分析
- Maven默认行为:
src/main/resources下的文件会被打包到War包的WEB-INF/classes目录中,这是Maven资源管理的默认规则。 - War插件配置缺失:当前
maven-war-plugin的web-resources配置未指定输出路径,导致资源仍按默认规则进入classes目录,而非War包根目录的resources文件夹。 - Spring MVC映射不匹配:如果资源在
classes目录下,servlet.xml中<mvc:resources>的location参数未指向classpath,导致映射路径无法找到资源。
解决方案
方案一:将资源打包到War包根目录的resources下
修改pom.xml的maven-war-plugin配置,添加<targetPath>指定资源输出到War包根目录的resources文件夹:
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <web-resources> <resource> <directory>src/main/resources</directory> <targetPath>/resources</targetPath> <!-- 指定输出到War包根目录的resources --> <includes> <include>**/*.css</include> </includes> </resource> </web-resources> <outputDirectory>../../tomcat/webapps</outputDirectory> </configuration> </plugin> </plugins>
- 此配置会将
src/main/resources下的CSS文件复制到War包根目录的/resources/css路径下,与JSP中的引入路径完全匹配。 - 无需修改
servlet.xml和JSP代码,原配置即可生效。
方案二:保留资源在classes目录,修正Spring MVC映射
如果不想改变资源的打包位置,可修改servlet.xml中的<mvc:resources>配置,将location指向classpath下的资源目录:
<mvc:resources location="classpath:/resources" mapping="/resources/**"></mvc:resources>
- Spring MVC会将
/resources/**的请求映射到WEB-INF/classes/resources/**路径下的资源,JSP中的引入路径无需修改。 - 注意:需确保Spring MVC配置中已添加
<mvc:annotation-driven>标签,否则静态资源映射可能无法生效。
验证步骤
- 执行
mvn clean install重新打包。 - 查看生成的War包结构,确认资源路径符合预期:
- 方案一:War包根目录存在
/resources/css/style.css。 - 方案二:
WEB-INF/classes/resources/css/style.css存在。
- 方案一:War包根目录存在
- 启动Tomcat,访问JSP页面,检查浏览器控制台是否有404错误,或通过页面元素查看CSS是否成功加载。
内容的提问来源于stack exchange,提问作者CodeRonin
相关产品推荐
相关产品推荐

