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

使用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());
    

现有代码的逻辑错误修复

解决类加载问题后,现有代码仍存在两处会导致邮件发送失败的逻辑问题,需同步修正:

  1. 配置项key书写错误:原代码将SMTP端口值错误绑定到mail.smtp.auth配置项下,端口的正确配置key为mail.smtp.port,修正写法:
    properties.put("mail.smtp.port", "587");
    
  2. 空返回值风险:prepareMessage方法在捕获异常后会返回null,后续调用Transport.send(message)时会触发空指针异常。建议捕获异常后直接抛出运行时异常中断流程,不要返回null值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 04:45:01