使用javax.mail发送邮件出现NoClassDefFoundError: AddressException怎么办
NoClassDefFoundError: javax/mail/internet/AddressException 排查与解决 异常本质
该错误属于运行期类加载失败,说明编译阶段类路径中存在目标类,但运行阶段的类加载路径无法找到该类的字节码定义,和代码语法正确性无关。
排查步骤
- 校验引入的依赖包完整性
Oracle官方分发的JavaMail组件是拆分设计的:主mail.jar仅包含核心抽象API,javax.mail.internet包下的AddressException、InternetAddress、MimeMessage等类全部封装在配套的实现包(旧版为配套的activation.jar,新版为单独的mailapi.jar)中。仅导入主库不导入配套依赖包时,必然触发该异常。
校验方式:解压你引入的所有jar包,确认存在javax/mail/internet/AddressException.class字节码文件,不存在则说明依赖不完整。
补充:JDK 9及以上版本已移除内置的JavaMail API,即使使用高版本JDK,也必须手动导入完整依赖,不能依赖JDK自带类。 - 校验运行时类路径配置
部分IDE会将编译依赖和运行依赖做隔离:仅配置到编译路径的jar不会被加入运行期类加载路径。需检查对应运行配置的类路径,确认所有邮件相关jar同时加入了运行类路径。
若为可执行Jar包运行场景,需确认MANIFEST.MF的Class-Path字段正确写入了邮件jar的相对路径,无遗漏。
若为Web容器(Tomcat、Jetty等)运行场景,需确认邮件jar放置在应用的WEB-INF/lib目录下,仅放到项目编译路径会导致容器类加载器无法检索到对应类。 - 排查类冲突
检查类路径中是否存在多版本的JavaMail相关jar,不同版本的包结构、类路径存在差异时,优先级更高的旧版本jar会被优先加载,进而触发类定义找不到的问题。
排查方式:在代码入口添加一行输出,确认实际加载AddressException类的jar来源:System.out.println(AddressException.class.getProtectionDomain().getCodeSource().getLocation());
现有代码的逻辑错误修复
解决类加载问题后,现有代码仍存在两处会导致邮件发送失败的逻辑问题,需同步修正:
- 配置项key书写错误:原代码将SMTP端口值错误绑定到
mail.smtp.auth配置项下,端口的正确配置key为mail.smtp.port,修正写法:properties.put("mail.smtp.port", "587"); - 空返回值风险:
prepareMessage方法在捕获异常后会返回null,后续调用Transport.send(message)时会触发空指针异常。建议捕获异常后直接抛出运行时异常中断流程,不要返回null值。
内容的提问来源于stack exchange,提问作者RESOLUME CODES
相关产品推荐
相关产品推荐

