Java邮件功能在Netbeans正常,部署到Tomcat8后类找不到异常
解决Tomcat8部署JavaMail Web服务出现的NoClassDefFoundError问题
我之前在部署邮件相关Web服务时也碰到过一模一样的问题,咱们一步步来排查和解决:
问题根源分析
你遇到的java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger本质是Tomcat找不到JavaMail的核心实现类,大概率是这几个原因导致的:
- jar包版本不兼容或不完整:
javax.mail-api-1.6.0.jar是API定义包,但还需要对应的实现包,旧的mail.jar可能和1.6.0版本的API不匹配; - jar包放置路径错误:Tomcat不会从
WEB-INF/classes下的子目录加载jar包,你放在/var/lib/tomcat8/webapps/mywebservice/WEB-INF/classes/dz/mywebservice/lib/里的jar根本没被识别; - 重复jar包导致类加载冲突:同时在Tomcat全局
/usr/share/tomcat8/lib/和Web应用私有目录放邮件jar,会让类加载器混乱。
具体解决方案
清理并调整jar包位置
- 先删除
/usr/share/tomcat8/lib/下所有JavaMail相关jar,避免全局类加载干扰; - 把邮件jar移到Web应用的
WEB-INF/lib目录下(也就是/var/lib/tomcat8/webapps/mywebservice/WEB-INF/lib/),删除WEB-INF/classes下的lib子目录及里面的jar——Tomcat只会从WEB-INF/lib加载应用私有jar。
- 先删除
替换为匹配的JavaMail jar包
- 放弃旧的
mail.jar,下载和javax.mail-api-1.6.0.jar版本完全一致的实现包:javax.mail-1.6.0.jar(这个包包含了com.sun.mail.util.MailLogger这类核心实现类); - 确保你的WEB-INF/lib下只有
javax.mail-api-1.6.0.jar和javax.mail-1.6.0.jar这两个jar,没有其他版本的邮件相关包。
- 放弃旧的
修复权限并重启Tomcat
- 给jar包设置合理权限(不用777,可读即可):
chmod 644 /var/lib/tomcat8/webapps/mywebservice/WEB-INF/lib/*.jar - 重启Tomcat让修改生效:
systemctl restart tomcat8
- 给jar包设置合理权限(不用777,可读即可):
验证
重启完成后测试你的邮件发送接口,这个NoClassDefFoundError应该就消失了。
内容的提问来源于stack exchange,提问作者Abdou Dadou
相关产品推荐
相关产品推荐

