Spring Boot部署服务器后发送邮件报jakarta.mail.Provider缺失错误
解决方案
针对你遇到的java.lang.NoClassDefFoundError: jakarta/mail/Provider问题,结合本地正常、服务器报错的场景,给你几个排查方向:
检查依赖打包情况
确认你的com.sun.mail:jakarta.mail:1.6.7依赖是否被正确打包到部署包中:- 如果用Maven,检查依赖的
<scope>是否为compile(默认值),不要设为provided——这个范围意味着依赖由服务器提供,但你的服务器显然没有这个类。 - 解压生成的war/jar包,查看
WEB-INF/lib(war包)或BOOT-INF/lib(Spring Boot jar包)目录,确认是否存在jakarta.mail-1.6.7.jar。如果缺失,检查打包配置是否排除了该依赖。
- 如果用Maven,检查依赖的
排查服务器类加载冲突
服务器(比如Tomcat、Jetty)自身的lib目录可能存在旧版本的mail相关jar,和你的依赖冲突:- 登录服务器,查看应用服务器的全局lib目录(如Tomcat的
CATALINA_HOME/lib),如果有javax.mail.jar、jakarta.mail.jar这类旧文件,删除它们,避免类加载优先级问题。 - 用
mvn dependency:tree(Maven)或gradle dependencies(Gradle)查看项目依赖树,排查是否有其他依赖间接引入了冲突的mail版本,找到后用<exclusions>标签排除冲突依赖。
- 登录服务器,查看应用服务器的全局lib目录(如Tomcat的
确认依赖版本兼容性
com.sun.mail:jakarta.mail:1.6.7是基于Jakarta EE 8的版本,如果你的项目或服务器运行环境是Jakarta EE 9+,会存在API包名不兼容的问题(Jakarta EE 9将javax.*迁移到jakarta.*):- 尝试升级依赖版本到适配Jakarta EE 9+的版本,比如
com.sun.mail:jakarta.mail:2.0.1,同时确保项目的Java版本符合要求(2.x版本要求Java 8+)。
- 尝试升级依赖版本到适配Jakarta EE 9+的版本,比如
调整打包配置
如果是Spring Boot应用:- 确认
spring-boot-maven-plugin或spring-boot-gradle-plugin配置正确,没有通过<excludes>排除mail相关依赖。 - 若部署为war包,检查
pom.xml中packaging是否设为war,且spring-boot-starter-tomcat的scope设为provided时,没有影响mail依赖的打包。
- 确认
内容的提问来源于stack exchange,提问作者Ravindu Abeywardane
相关产品推荐
相关产品推荐

