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

Maven打包Web项目部署Tomcat报ClassFormatException错误如何解决?

问题原因

Maven确实在构建过程中修改了你的class文件,核心问题出在maven-war-plugin的配置中,你给WebContent/WEB-INF目录的资源开启了<filtering>true</filtering>。

filtering是Maven提供的资源变量替换功能,用于自动替换资源文件中的${}格式占位符。该功能默认按照字符编码(你配置的UTF-8)处理文件内容,仅适用于文本类文件,处理class、图片、二进制包这类非文本文件时,会直接破坏二进制结构,导致文件损坏无法被识别。

修复方案

你可以根据自己的实际需求选择以下任意一种配置:

方案1:无需对WEB-INF下的文件做变量替换

直接关闭WEB-INF资源的filtering即可,修改maven-war-plugin配置如下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <warName>${project.artifactId}</warName>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <webResources>
            <resource>
                <directory>WebContent/axis2-web</directory>
                <targetPath>axis2-web</targetPath>
                <!-- 如果axis2-web下也没有需要替换的变量,这里也可以改成false -->
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>WebContent/WEB-INF</directory>
                <targetPath>WEB-INF</targetPath>
                <!-- 关闭过滤,避免二进制文件被修改 -->
                <filtering>false</filtering>
            </resource>
        </webResources>
    </configuration>
</plugin>

方案2:需要对WEB-INF下的部分文本文件做变量替换

如果WEB-INF下存在properties、xml等需要替换变量的文本文件,你可以拆分资源配置,单独排除class文件的过滤:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <warName>${project.artifactId}</warName>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <webResources>
            <resource>
                <directory>WebContent/axis2-web</directory>
                <targetPath>axis2-web</targetPath>
                <filtering>true</filtering>
            </resource>
            <!-- 配置1:处理需要过滤的文本文件 -->
            <resource>
                <directory>WebContent/WEB-INF</directory>
                <targetPath>WEB-INF</targetPath>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                    <include>**/*.jsp</include>
                    <!-- 按需添加其他需要过滤的文本文件后缀 -->
                </includes>
            </resource>
            <!-- 配置2:处理不需要过滤的二进制文件 -->
            <resource>
                <directory>WebContent/WEB-INF</directory>
                <targetPath>WEB-INF</targetPath>
                <filtering>false</filtering>
                <excludes>
                    <exclude>**/*.xml</exclude>
                    <exclude>**/*.properties</exclude>
                    <exclude>**/*.jsp</exclude>
                    <!-- 和上面的includes保持一致即可 -->
                </excludes>
            </resource>
        </webResources>
    </configuration>
</plugin>

配置完成后重新执行mvn clean package打包,class文件就不会被修改,部署后也不会再报类格式错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:06:03