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

Tomcat 10.1.x部署Spring Boot3+Java17应用时JavaMailSender实例化失败

解决Spring Boot 3 + Java 17 部署Tomcat 10.1.x时的mailSender Bean创建异常

异常信息

Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'mailSender' defined in class path
resource [org/springframework/boot/autoconfigure/mail/MailSenderPropertiesConfiguration.class]: Failed to
instantiate [org.springframework.mail.javamail.JavaMailSenderImpl]:
Factory method 'mailSender' threw exception with message: arraycopy:
element type mismatch: can not cast one of the elements of
java.lang.Object[] to the type of the destination array,
jakarta.activation.MimeTypeRegistry

问题原因

核心是类加载器冲突:Tomcat 10.1.x自带了jakarta.activation相关类,而Spring Boot 3的邮件starter默认会引入该模块的依赖,导致同一个MimeTypeRegistry类被Tomcat核心类加载器和Web应用类加载器分别加载,JVM会判定这两个类属于不同类型,最终在JavaMailSenderImpl初始化时触发类型转换异常。

可行解决方案

方案1:排除Spring Mail中的activation依赖

修改项目依赖配置,让应用直接使用Tomcat提供的activation版本,避免重复打包。

Maven配置(pom.xml):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <exclusions>
        <exclusion>
            <groupId>jakarta.activation</groupId>
            <artifactId>jakarta.activation-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Gradle配置(build.gradle):

implementation('org.springframework.boot:spring-boot-starter-mail') {
    exclude group: 'jakarta.activation', module: 'jakarta.activation-api'
}

方案2:调整Tomcat类加载器优先级

修改Tomcat的conf/context.xml,在<Context>标签内添加类加载器配置,让Web应用优先使用自身打包的类(不推荐,可能引发其他依赖冲突):

<Loader delegate="false" />

默认delegate="true"表示Tomcat核心类优先加载,改为false后会优先加载应用自身的类。

方案3:改用Spring Boot内置Tomcat运行

如果不需要部署到外部Tomcat,直接打包成可执行JAR运行,完全规避类加载器冲突:

java -jar your-application.jar

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:15:42