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

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

问题分析

  1. Maven默认行为:src/main/resources下的文件会被打包到War包的WEB-INF/classes目录中,这是Maven资源管理的默认规则。
  2. War插件配置缺失:当前maven-war-plugin的web-resources配置未指定输出路径,导致资源仍按默认规则进入classes目录,而非War包根目录的resources文件夹。
  3. 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>标签,否则静态资源映射可能无法生效。

验证步骤

  1. 执行mvn clean install重新打包。
  2. 查看生成的War包结构,确认资源路径符合预期:
    • 方案一:War包根目录存在/resources/css/style.css。
    • 方案二:WEB-INF/classes/resources/css/style.css存在。
  3. 启动Tomcat,访问JSP页面,检查浏览器控制台是否有404错误,或通过页面元素查看CSS是否成功加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:16:10